题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
在做这个问题之前,让我们看看简化版题目的做法。
简化版题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析: 对于这样的问题,采用递归求解是最佳方法。通过分析很容易得到下表。
台阶数n | 跳法 |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
… | … |
n | ? |
表1
分析表1,我们可以得到如下规律:(设method[n]表示台阶数为n的跳法和)
method[n]=method[n-1]+method[n-2];
简化版代码如下;
int jumpFloor(int number)
{
if(number==0)
return 0;
else if(number==1)
return 1;
else if(number==2)
return 2;
else
{
return jumpFloor(number-1)+jumpFloor(number-2);
}
}
接下来,我们来看原题:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
台阶数n | 跳法 |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 4 |
4 | 8 |
5 | 16 |
… | … |
n | ? |
表2
一样去总结规律:((设method[n]表示台阶数为n的跳法和))
method[n]=method[n-1]+method[n-2]+...+method[1]+method[1]+1;
代码如下:
int jumpFloorII(int number)
{
if(number==0)
return 0;
else if(number==1)
return 1;
else
{
int x=0;
for(int i=1;i<number;i++)
{
x+=jumpFloorII(i);
}
return x+1;
}
}