题目描述1——普通跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析
当有0级台阶的时候,有0种跳法
当有1级台阶的时候,有1种跳法
当有2级台阶的时候,有2种跳法
当有3级台阶的时候,有3种跳法
当有4级台阶的时候,有5种跳法
。。。
那么,从1级台阶以后,跳法是不是很像斐波那契数列从第2项开始的数列?
于是可以参照斐波那契数列的方法来做。
1、递归
class Solution {
public:
int jumpFloor(int number) {
if(number == 1) {
return 1;
} else if (number == 2) {
return 2;
} else if(number > 2) {
return jumpFloor(number - 1) + jumpFloor(number -2);
} else {
return -1;
}
}
};
2、定义变量
class Solution {
public:
int jumpFloor(int number) {
if(number == 1) {
return 1;
} else if (number == 2) {
return 2;
} else if(number > 2) {
int first = 1;
int second = 2;
int res;
int cnt = 3;
while(cnt <= number) {
res = first + second;
first = second;
second = res;
cnt++;
}
return res;
} else {
return -1;
}
}
};
题目描述2——变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析
可以用逆推的思路去想,跳n级台阶,可以从n-1级跳上来,也可以从n-2级跳上来,从n-3级跳上来,依次下去,从第1级跳上去,或直接跳上去,所以,跳n级台阶的方法数相当于其它所有台阶数的方法的总和再加上从0级跳上去,表达式为 f(n) = f(n-1) + f(n-2) +…+ f(2) + f(1) + 1。例如:
当跳1级台阶时,f(1) = 1;
当跳2级台阶时,f(2) = f(1) + 1 = 2;
当跳3级台阶时,f(3) = f(2) + f(1) + 1 = 4;
当跳4级台阶时,f(4) = f(3) + f(2) + f(1) + 1 = 8;
。。。。。。。。。。。。。。。。。。。。。
f(n) = f(n-1) + f(n-2) +…+ f(2) + f(1) + 1
f(n-1) = f(n-2) +…+ f(2) + f(1) + 1
两式作差 f(n) - f(n-1) = f(n-1) 推出f(n) = 2 * f(n-1)
代码
class Solution {
public:
int jumpFloorII(int number) {
if(number <= 0) {
return 0;
} else if (number == 1) {
return 1;
} else {
return 2*jumpFloorII(number - 1);
}
}
};