问题描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
问题分析
当n=1,有一种跳法
当n=2,一次跳一个跳两次,一次跳两个跳一次,共两种跳法
当n>=2时,n个台阶,设有F(n)种跳法
(1)若第一次选择跳1个台阶,那么剩下的n-1个台阶有F(n-1)种跳法
(2)若第一次选中跳2个台阶,那么剩下的n-2个台阶有F(n-2)种跳法
所以当有n个台阶时 F(n) = F(n-1)+F(n-2)种跳法。
此问题可以归结为斐波那契数列问题(需要注意的是斐波那契数列的第二项是1,此问题当n=2时是2)
代码实现
递归实现
涉及到菲波那切数列的问题,首先想到的是递归实现,在递归中当n=1时,f(n)=1,当n=2时,f(n)=2,当n>=3时,f(n)==f(n-1)+f(n-2)。那么代码就很好实现了。
public static int jumpFloor(int n){
if(n==1 || n==2){
return n;
}else{
return jumpFloor(n-1) + jumpFloor(n-2);
}
}
代码分析:使用递归实现,时间复杂度高,运行时间较长,如果在编程中对运行时间有限定,那么使用递归并不是完美的方法。
非递归实现(迭代)
其实,如果数学好一点的同学,通过数学归纳法的话,对这个问题进行迭代处理也是一种很好的方法。从第三个数开始,一次取3个数分析,那么把第一个数设为preTwo,把第二个数设为preOne,第三个数为result。那么有如下关系result=preOne+preTwo.运算完后,那么把整体的preTwo,preOne,result向后移动一位。然后迭代地result=preOne + preTwo。直到你要求的第n个数,迭代结束,最后的result就是你要求的第n个台阶可以使用的方法数。
上代码:
public static int jumpFloor1(int n){
int preTwo = 1;//数列的第一个数
int preOne = 2;//数列的第二个数
int result = 0;
if(n==1 || n==2){
return n;
}
for(int i=3;i<=n;i++){
result = preTwo + preOne;
//迭代
preTwo = preOne;
preOne = result;
}
return result;
}