青蛙跳台阶问题:
普通跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)
分析:
设f(n)表示跳上第n个台阶的跳法数目,则很容易想到 f(1)=1,f(2)=2 ,当n>2时,则跳到第n个台阶前的位置,一定是在第(n-1)个台阶或者第(n-2)个台阶上,因此在此处得到数学关系为 f(n)=f(n-1)+f(n-2)
实际上该数学关系为 斐波那契数列
很容易根据该思路写出递归代码:
class Solution {
public:
int jumpFloor(int number) {
if(number<0)
return 0;
if(number<=1)
return 1;
else
return jumpFloor(number-1)+jumpFloor(number-2);
}
};
但是我们可以发现,这样写的话会有大量重复计算,即就算已经算出了 jumpFloor(number-2) ,在计算jumpFloor(number-1)时还会再计算一遍,因此复杂度将以指数形式上升。
解决该问题的办法有两个,一种是以正向循环的方式求解,即顺序求f(1),f(2)…f(n-1),f(n),这样便不会有重复计算