升级版爬楼梯问题

1 一个台阶有n阶,如果一次可以跳1阶,也可以跳2阶,求总共有多少种跳法?

思考:
当楼梯为1阶时,1【1种跳法】;
当楼梯为2阶时,有1+1  2 【2种跳法】
当楼梯为3阶时,有1+1+1 1+2(改变2的位置2次)【3种跳法】
当阶梯为4阶时,有1+1+1+1 2+1+1 (改变2的位置3次) 2+2【5种跳法】
当阶级为5阶时,有1+1+1+1+1,2+1+1+1(改变2的位置4次) 2+2+1(改变1的位置3次)【8种跳法】
当阶梯为6阶时,有1+1+1+1+1+1,2+1+1+1+1(改变2的位置5次) 2+2+1+1(互换6次) 2+2+2【13种跳法】
-----------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------
当阶梯数为n阶时,有f(n)=f(n-1)+f(n-2) (n>=3);
代码实现:
1 int stair(int n)//楼梯跳法函数
2 {
3      if(n==1) return 1;
4      if(n==2) return 2;
5     else
6     return stair(n-1)+stair(n-2);
7 }
2 一个台阶有n阶,如果一次可以跳1阶,也可以跳2阶,---------最多跳m阶(m<=n),求总共有多少种跳法?
还是按照上述分析:
a.当m=3时,
当楼梯为1阶时,1种跳法;
当楼梯为2阶时,2种跳法;
当楼梯为3阶时,4种跳法;
当楼梯为4阶时,7种跳法;
当楼梯为5阶时,13种跳法;
当楼梯为6阶时,24种跳法;
---------------------------
---------------------------
当楼梯为n阶时,有f(n)=f(n-1)+f(n-2)+f(n-3) (n>=4)
 
b.m=4时,
当楼梯为1阶时,1种跳法;
当楼梯为2阶时,2种跳法;
当楼梯为3阶时,4种跳法;
当楼梯为4阶时,8种跳法;
当楼梯为5阶时,15种跳法;
当楼梯为6阶时,29种跳法;
---------------------------
---------------------------
当楼梯为n阶时,有f(n)=f(n-1)+f(n-2)+f(n-3) +f(n-4)(n>=5)
 
c.m=5时,
当楼梯为1阶时,1种跳法;
当楼梯为2阶时,2种跳法;
当楼梯为3阶时,4种跳法;
当楼梯为4阶时,8种跳法;
当楼梯为5阶时,16种跳法;
当楼梯为6阶时,31种跳法;
---------------------------
---------------------------
当楼梯为n阶时,有f(n)=f(n-1)+f(n-2)+f(n-3) +f(n-4)+f(n-5)(n>=6)
 
d.当m<n时,假设m=5,n=9时;
当楼梯为1阶时,2^0种跳法;
当楼梯为2阶时,2^1种跳法;
当楼梯为3阶时,2^2种跳法;
当楼梯为4阶时,2^3种跳法;
当楼梯为5阶时,2^4种跳法;
当楼梯为6阶时,f(6)=f(1)+f(2)+f(3)+f(4)+f(5);
当楼梯为7阶时,f(7)=f(2)+f(3)+f(4)+f(5)+f(6)=2*f(6)-f(1);
当楼梯为8阶时,f(8)=f(3)+f(4)+f(5)+f(6)+f(7)=2*f(7)-f(2);
当楼梯为9阶时,f(9)=f(4)+f(5)+f(6)+f(7)+f(8)=2*f(8)-f(3);
 1 long stair(const int n, const int m, long * const f) 
 2 {  
 3     int i; 
 4     f[0] = f[1] = 1; 
 5     for (i = 2; i <= m; ++ i) 
 6         f[i] = f[i - 1] * 2; 
 7     for (i = m + 1; i <= n; ++ i) 
 8         f[i] = f[i - 1] * 2 - f[i - m - 1]; 
 9     return f[n]; 
10 }

 

 
 

posted on 2016-05-01 16:47  wxdjss  阅读(491)  评论(0编辑  收藏  举报

导航