目录
问题一
现有n阶台阶,有一只青蛙要从台阶底跳上台阶顶。这只青蛙每次可以跳一阶,也可以跳两阶。问这只青蛙有多少种跳法可以完成目标?
分析:这种问题可以先从简单情况着手,记总共有jump(n)种方法。
当n=1时,jump(1) = 1; // 1
当n=2时,jump(2) = 2; // 1+1、2
当n=3时,jump(3) = 3; //1+1+1、 1+2 先跳一步,再跳两步(jump(2))、 2+1 先跳两步,在跳一步
当n=4时,jump(4) = 5; //参考n=3思考过程
此时,我们发现规律为:
jump(1) = 1; jump(2) = 2;
jump(n) = jump(n-1) +jump(n-2) n >2;
//形式上为斐波那契数列
function jump(n){
let res =0;
if (n <1) {
return res = -1;
}
if (n ==1 || n ==2) {
return res = n;
}else{
return jump(n-1) + jump(n-2);
}
}
console.time('jump');
console.log(jump(5)); //8 jump: 2.552978515625ms
console.log(jump(40)); //165580141 jump: 927.423095703125ms
console.endTime('jump');
仔细看一眼返回值,发现函数使用了递归,当调用过深时,耗时非常长,而且可能会造成爆栈;下面谈谈递归和迭代。
了解递归和迭代
迭代:我们经常在for循环中写这样的语句: r