题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
考察点:数学建模能力,公式推导及规律总结。
参考了网上的思路,自己整理了一下。要想跳上第n级台阶,就考虑跳上n-1级,n-2,n-3,2,1级台阶的情况,
最后再加上一下子跳上n级台阶的情况。
方法1:传统递归(复杂度比较高,包含大量重复运算)
class Solution {
public:
int jumpFloorII(int number) {
if (number == 0 || number == 1)
return 1;
if (number == 2)
return 2;//递归返回条件
int sum = 0;
for (int i = 0; i < number; i++)
{
sum += jumpFloorII(i);//递归操作,其中一下子跳上去的次数1用jumpFloorII(0)来代替累加。
}
return sum;
}
};
方法2:双重循环
class Solution {
public:
int jumpFloorII(int number) {
if (number == 0 || number == 1)
return 1;
vector<int> result(number);//设置存放每个number跳法次数的vector
for (int i = 1; i <= number; i++)
{
int sum = 0;
for (int j = 1; j <i; j++) //每次累加到少一项的时候
{
sum += result[j];
}
result[i] = sum + 1;//最后加上一下子跳上去那次
}
return result[number];
}
};
方法3:动态规划(大问题分解为小问题的递归方程求出)
递归方程就是数学归纳法的过程,利用重复性计算消除公共项。得到F(n)=2*F(n-1)
class Solution {
public:
int jumpFloorII(int number) {
vector<int> result(number + 1);
result[0] = 1;
result[1] = 1;
result[2] = 2;
for (int i = 3; i <= number; i++)
result[i] = 2 * result[i - 1];//动态规划的条件方程
return result[number];//包含了以上的情况
}
};