题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路:
1.由题可得,青蛙要想跳上第n级台阶,可以从第n-1级台阶跳一级,可以从n-2级台阶跳两级,可以从n-3级台阶跳3级,可以从第0级台阶直接跳n级。
2.如果设n级台阶有f(n)种跳法,那么n-1级台阶有f(n-1)种跳法,n-2级台阶有f(n-2)种跳法,n-3级台阶有f(n-3)种跳法,…。
3.所以f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1);进而我们可以知道f(n-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) ;联立方程我们可以得到f(n)=f(n-1)+f(n-1)=2*f(n-1)。
4.由我们所推导的公式,我们又可以轻松地用递归解决啦!
方法一:递归
代码如下:
public int JumpFloor(int target) {
if(target<=0)
return -1;
else if(target==1) {
return 1;
}else {
return 2*JumpFloor(target-1);
}
}
方法二:递推
由上面推导的公式可知:
f(2)=2f(1);
f(3)=2f(2);
f(4)=2f(3);
f(5)=2f(4);
而当阶梯只有一级的时候已经知道了,结果为1,只有一种跳法;
所以,我们可以运用递推解决这道题;
代码如下:
public static int JumpFloor2(int target) {
if(target==1) {
return 1;
}
int result=1;
for(int i=2;i<=target;i++) {
result=2*result;
}
return result;
}
方法三:数学公式
由上面我们所推导的公式f(n)=2*f(n-1)可知,这道题为等比数列,公比为2,首项为1;
所以f(n)等于2的n-1次方乘以1;
代码如下:
public static int JumpFloor3(int target) {
return (int) (Math.pow(2,target-1)*1);
}