【牛客网-剑指offer】跳台阶

题目:

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

考点:

递归和循环

思路:

1)利用二叉树,左孩子为跳一级,右孩子为跳两级,直到剩余台阶数为0,即叶子节点为0,计算为0的叶子节点数量,即跳法数量(该方法不可取,当台阶数足够大时,空间复杂度太大)
2) 跳台阶符合斐波那契数列规律:跳法[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89...]

证明:

记 Fb(i) 为斐波那契数列第 i 项的值(i 从 0 开始),jump(i) 为台阶数为 i 时的总跳数,number 为台阶数
当 number = 0 或 1 的时候,跳法为 1,jump(0) = Fb(0),jump(1) = Fb(1) 成立;
假设当 number = n (n > 1) 的时候,有 jump(n) = Fb(n) 成立,则当 number = n + 1 的时候, 有两种互斥的跳法:
① 跳到第 n 级,再跳 1 级,则跳到第 n 级有几种方法,此种跳法就有多少,即为 jump(n)。
注意这里并不是 jump(n) + 1,这里是指跳法为“跳到第 n 级,再跳 1 级”这种跳法,“再跳1级”指基于跳 n 级的基础上
② 跳到第 n - 1 级,再跳 2 级,跳法为 jump(n-1)。
注意这里只能一口气跳 2 级了,否则跳 1 级,就和跳法①重叠了
即有jump(n+1) = jump(n) + jump(n-1) = Fb(n) + Fb(n-1) = Fb(n+1)
jump(n+1) = Fb(n+1) 成立。

⇒递归转迭代代码:(递归是利用自身算法,下面代码思想和递归类似,但不是递归)

function jumpFloor(n)
{
    // write code here
     var fb = [1, 1];
    for (var i = 2; i <= n; i++) {
        fb.push(fb[i - 2] + fb[i - 1]);
    }
    return fb[n];
}
posted @ 2019-09-25 16:47  侠客cp  阅读(141)  评论(0编辑  收藏  举报