跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析
设有n级台阶时有跳法f(n)种,当n>2时,第一次跳台阶可以跳一阶,此时跳法数目等于后面n-1级台阶的跳法f(n-1);当第一次跳二阶,此时跳法数目等于后面n-2级台阶的跳法f(n-2)。所以f(n)=f(n-1)+f(n-2)。由此可以看出这是斐波那契数列的应用。将斐波那契数列向前移了一位。
public int JumpFloor(int target) {
if(target <= 2) {
return target;
}
int t1 = 1;
int t2 = 2;
int temp = 0;
for (int i = 3; i <= target; i++) {
temp = t1 + t2;
t1 = t2;
t2 = temp;
}
return temp;
}
扩展题目
变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析
对于一级台阶,可以跳f(1) = 1种跳法
对于二级台阶,他可以跳一级或两级,f(2) = f(2-1)+f(2-2)
对于三级台阶,他可以跳1级,2级,3级。那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)。所以:f(3) = f(3-1)+f(3-2)+f(3-3)
那么对于n级台阶,会有n种跳的方式,1阶、2阶…n阶,综上可以得出结论:
两式相减:
f(n) = 2 * f(n - 1)
由此看出这是一个递归的考察
代码
public int JumpFloor_2(int target) {
if(target <= 2) {
return target;
}
return 2 * JumpFloor_2(target - 1);
}
当然也可以使用循环来进行优化:
public int JumpFloor_2_5(int target) {
if(target <= 2) {
return target;
}
int temp = 0;
int oldtemp = 2;
for (int i = 3; i <= target; i++) {
temp = oldtemp * 2;
oldtemp = temp;
}
return temp;
}