第一种
一共有5个台阶,每一次可以跳一个或两个台阶。
思路:设完成跳台阶的函数是jump(5)
完成这个动作最后可能有
- 最后跳了一下就跳完了;
- 最后跳了两下就跳完了;
1——它的位置在第四个台阶,跳到这里要jump(4);
2——它的位置在第三个台阶,跳到这里要jump(3);
所以在这种情况下jump(5)=jump(4)+jump(3).
我们再将总共的台阶数看成n个
最后可能情况为
- 最后跳了一下就跳完了;
- 最后跳了两下就跳完了;
与上一种情况相同;
jump(n)=jump(n-1)+jump(n-2)
(注意当n=1时有一种方法,n=2时有两种方法作为结束递归的出口)
//这里讨论1或2的原因
eg:n=3时=jump(2)+jump(1);如果不考虑n=2有两种情况
jump(2)=jump(1)+jump(0)=1但实际上n=2时有两种情况,会出现错误。
对应代码实现为
观察输出结果
发现是斐波那契数。
第二种
一共n个台阶,每次可以跳1,2,3到n个台阶。
根据上面的分析
最后可能的情况为:
剩一个,剩两个…剩n个;
//剩n个到此位置的方法为0;jump(0)=0
jump(n)=jump(n-1)+jump(n-2)…+jump(0);——1
———————一共n个———————
对应jump(n-1):
jump(n-1)=jump(n-2)+…jump(0);——2
1式与2式联立求解
jump(n)=jump(n-1)+jump(n-1)=2*jump(n-1);
对应代码:
输出结果
第三种
有n个台阶,每次可以跳1,2,3…m个台阶
因为m与n的大小未知所以要讨论
当m>=n时
跳到最后的可能情况:
剩n个,剩n-1个,…剩1个;
所以这种情况和第二种相同,
jump(n)=2*jump(n-1)
当m<n
跳到最后可能的情况
剩m个跳完——在此位置可能情况jump(n-m)
剩m-1个跳完——位置可能情况jump(n-(m-1))
…
剩一个跳完——可能情况jump(n-1)
此时
jump(n)=jump(n-1)+jump(n-2)…+jump(n-m);
jump(n-1)=jump(n-2)…jump(n-m)+jump(n-m-1);
联立求解
jump(n)=jump(n-1)+jump(n-1)-jump(n-m-1);
jump(n)=2*jump(n-1)-jump(n-m-1);
对应代码
输出结果