台阶问题 记住斐波那契数列
我以前总结过的
想想先。。。
有10个台阶,最多一次跨2级台阶,有多少种走法?有简便的算法么?
我们倒过来看:
假设现在第9级台阶上,那么只有1种走法;
假设现在第8级台阶上,那么有2种走法;
假设7,那么有12、21、111共3种走法(因为他接下来2种可能:一是走上了第八级,另一是走上了第九级,所以1+2=3种);
。。。
依次类推,这个数列是1、2、3、5、8、13、21、34、55、89(最开始站在0级上)
/*10个台阶 每次做多走2级 有多少种*/
# include <iostream>
using namespace std;
int fun(int a){
if(a==9)
return 1;
else if(a==8)
return 2;
else{
return fun(a+1)+fun(a+2);
}
return 0;
}
int main(){
//假设9->1 ;8->2;7->3;6->5;5->8;4->13;3->21;2->34;1->55;0->89
int m = fun(0);
cout<<m<<endl;
return 0;
}
这是最多一次跨2级的走法。现在说最多一次跨3级的走法:
同样倒过来看:
假设在9,1种;
在8,2种;
在7,4种(为什么不等于1+2呢,因为在这里他可以直接走上去,而不需要分情况,所以独立计算);
在6,7种(接下来3种可能:所以三种相加);
。。。
依次类推,也就是前三项之和,1、2、4、7、13、24、。。。。
/*10个台阶 每次做多走3级 有多少种*/
# include <iostream>
using namespace std;
int fun(int a){
if(a==9)
return 1;
else if(a==8)
return 2;
else if(a==7)
return 4;
else{
return fun(a+1)+fun(a+2)+fun(a+3);
}
return 0;
}
int main(){
//假设9->1 ;8->2;7->4;6->7;5->13;4->24;3->44;2->3?;1->5?;0->8?
int m = fun(0);
cout<<m<<endl;
return 0;
}
如果一次只能跨2或者3级:
假设9,1种;
假设8,1种;
假设7,2种;
假设6,2种;
假设5,3种(因为能跨到7或8);
。。。
依次类推,就是一二项之和等于第四项,1、1、2、2、3、4、5、7、。。。
总之,无论这类型的题千变万化,都可以归结为斐波那契数列及其变种