一 青蛙跳台阶问题
问题描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级台阶总共有多少种跳法。
问题的分析:
一级台阶:1种 fib(1)=1
二级台阶:2种 fib(2)=2
三级台阶:3种 fib(3)=fib(1)+fib(2)=3
四级台阶:5种 fib(4)=fib(2)+fib(3)=5
五级台阶:8种 fib(5)=fib(3)+fib(4)=8 规律如下:fib(n)=fib(n-1)+fib(n-2),fib(1)=1,fib(2)=2。
java代码如下所示(直接在main函数中调用即可)
public int jumpFloor(int number) {
if (number == 1)
return 1;
else if (number == 2)
return 2;
else
return jumpFloor(number-1)+jumpFloor(number-2);
}
二 变态青蛙跳台阶问题
变态跳台阶问题是这样的:如果青蛙可以一次跳 1 级,也可以一次跳 2 级,一次跳 3 级,…,一次跳 n 级。问要跳上第 n级台阶有多少种跳法?
同样的,我们采用逆向思维,将问题改为:跳上第 n级台阶该怎么跳?答案如下:
要跳上第 n级台阶,可以从第 n−1级台阶一次跳上来,也可以可以从第 n−2级台阶一次跳上来,也可以可以从第 n−3级台阶一次跳上来,…,也可以可以从第 1级台阶一次跳上来。那么问题就很简单啦,同样的,令 f(n) 表示从第一级台阶跳上第 n级台阶有几种跳法。则有如下递推公式:
f(n)=f(n−1)+f(n−2)+...+f(1)
同时, f(n−1) 也可以表示如下:
f(n−1)=f(n−2)+f(n−3)+...+f(1)
所以,由上面两个公式可知:
f(n)=2f(n−1)=4f(n−2)=8f(n−3)=...
即:
f(n)=2f(n−1)=22f(n−2)=23f(n−3)=...=2n−1f(n−(n−1))=2n−1f(1)
因为
f(1)=1
,所以
f(n)=2n−1
。
代码如下:
int square(int a) { return a * a; }
int power2(int n) { // 计算2的n次方
if (0 == n) return 1;
return n % 2 ? square(power2(n>>1))<<1 : square(power2(n>>1));
}
int jumpFloorII(int number) {
return power2(number - 1);
}