题目描述:一只青蛙一次可以跳上一个台阶,也可以跳上两级....他也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法?
时间限制:1秒
空间限制:32768K
思路分析:这道题考察了递归的思想方法。
A.第一种,我们可以从第一次跳的台阶数来分析
当n=0、n=1时,毫无疑问,有一种跳法
当n>=2时:
假定第一次跳一个台阶,则剩余n-1个台阶,有f(n-1)种跳法,共有:f()
假定第一次跳两个台阶,则剩余n-2个台阶,有f(n-2)种跳法
......
假定第一次跳(n-1)个台阶,则剩余1个台阶,有f(1)种跳法
假定第一次跳n个台阶,则剩余0个台阶,有1种跳法
所以 f(n)=f(n-1)+f(n-2)+...+f(1)+f(0)——①
f(n-1)= f(n-2)+...+f(1)+f(0)——②
用①减去②得:f(n)=2*f(n-1)
综上所述:f(n)={1,n=0;1,n=1;2*f(n-1),n>=2}
B.第二种,我们可以从台阶数有多少来分析
假设有1个台阶,有一种跳法,f(1)=1
假设有2个台阶,有两种跳法,f(2)=f(2-1)+f(2-2)
假设有3个台阶,有三种跳法,f(3)=f(3-1)+f(3-2)+f(3-3)
......
假设有n个台阶,有n种跳法,f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(n-(n-1))+f(n-n)
同理:f(n)=2*f(n-1)
综上所述:f(n)={1,n=0;1,n=1;2*f(n-1),n>=2}
C.每一个台阶都有跳与不跳两种情况,最后一个台阶必须跳,所以,共有2^(n-1)种情况
C++语言代码
class Solution {
public:
int jumpFloorII(int number) {
if(number<=0)
return -1;
else if(number==1)
{
return number;
}
else
{
return 2*jumpFloorII(number-1);
}
}
};