8.剑指offer-跳台阶*

时间:2022-11-22 07:21:10


题干

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
知识点:递归

我的思路

看了是递归的提示。但是实在没思路。代码没写出。

大佬解析

8.剑指offer-跳台阶*


代码:

public class Solution {
public int JumpFloor(int target) {
if(target <= 2){
return target;
}
//迭代的本质就是对递归对拆解,不需要强行理解pre1,2对应对阶数
int pre2 = 1, pre1 = 2;
for (int i = 3; i <= target; i++){
int cur = pre2 + pre1;
pre2 = pre1;
pre1 = cur;
}
return pre1;
}
}

总结:用递归的思路比较好理解,跳到第n个台阶最后一步只有两种可能,第一,从第n-1跳一级。第二,从n-2跳2级。也就是说f(n) = f(n-1) + f(n-2)。解析写的我觉得不是很好理解。对于递归来说,你要知道最起码的递推公式的前n项才可以用递归。还要抽象出递推公式,就像跳台阶问题:f(n) = f(n-1) + f(n-2),想要跳到n阶,最后一步可能跳1步也可能跳两步,也就是说算出来跳到n-1阶和跳到n-2阶的跳法,加起来就是n阶的。然后求出前两阶n=1,2时的跳法。就可以用递归了。
递归问题往往可以转化为循环问题。怎么说呢,递归在算法里面不是一种好的选项。尽量通过拆解转换成循环问题。递归为啥不好呢?因为递归往往意味着耗时,不可掌控。能不用就不用。

时间的维度:递归418ms,迭代只用30ms以内。

public class Solution {
public int JumpFloor(int target) {
//一种跳法跳到1,两种跳法跳到2
if(target<=2){
return target;
}
return JumpFloor(target-1)+JumpFloor(target-2);
}
}