10个台阶,每次最多上2阶,有多少种上法?

台阶问题  记住斐波那契数列
我以前总结过的  
想想先。。。

有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、。。。


总之,无论这类型的题千变万化,都可以归结为斐波那契数列及其变种

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值