题目:一只青蛙一次可以跳1级台阶,也可以跳2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解法一:递归。
当n=1时,有1种跳法;当n=2时,有两种跳法;当n>2时,第一次跳有两种选择,要么跳1级台阶,剩下的跳法等于f(n-1),要么跳2级台阶,剩下的跳法等于f(n-2),因此当n>2时,共有f(n) = f(n-1) + f(n-2)种方法。
public int JumpFloor(int n) {
if (n == 1)
return 1;
else if (n == 2)
return 2;
else
return JumpFloor(n - 1) + JumpFloor(n - 2);
}
解法一改进:减少重复计算。
采取递归的计算方法,会产生大量的重复计算,这会浪费大量时间。比如计算f(5)=f(4)+f(3)时,需要计算出f(4)和f(3),而计算f(4),由f(4)=f(3)+f(2),需要再次计算f(3)一次。可以考虑将计算过的值存储在数组中,当需要使用时通过索引来读取,效率更高。
public int JumpFloor2(int target) {
int resultNum[] = new int[100];
if (target == 1)
return 1;
else if (target == 2)
return 2;
else {
if (resultNum[target] != 0)
return resultNum[target];
else {
resultNum[target] = JumpFloor2(target - 1)
+ JumpFloor2(target - 2);
return resultNum[target];
}
}