【算法】动态规划之斐波那契数列

191 阅读2分钟

一、斐波那契数列

function feibo(n) {
    if (n == 0) return -1;
    if (n == 1) return 0;
    if (n == 2) return 1;
    return feibo(n - 1) + feibo(n - 2);
}
console.log(feibo(7))

二、青蛙跳台阶问题

一个青蛙,一次只能跳一级台阶,或者跳两级台阶,这个青蛙跳上n级台阶有多少种跳法?

当青蛙跳跳一个台阶时,只有1中跳法  

当青蛙跳跳2个台阶时,只有2中跳法   

在3个台阶时, 有 3种跳法 [(1,1,1),(1,2), (2,1) ];

在4个台阶时,有 5种跳法 [(1,1,1,1), (1,2,1), (1,1,2), (2,1,1),(2,2)];

即规律为(0,1,1,2,3,5...)

跳上n级台阶的跳法等于跳上n-1级台阶的跳法加上跳上n-2级台阶的跳法。

jump(n) = jump(n-1) + jump(n-2)

function jump(n) {
    if (n <= 0) return -1;
    if (n == 1) return 1;
    if (n == 2) return 2;
    return jump(n-1) + jump(n-2);
}
console.log(jump(3)) // 3

// 1 1 1
// 1 2
// 2 1

上面用递归实现的效率很低,当 N=50 的时候在chrome里就跑不动了,chrome会出现卡死。下面用迭代的方式效率会高出很多。

function jump(n) {
    let target = 0, number1 = 1, number2 = 2;
    if (n <= 0) return -1;
    if (n == 1) return 1;
    if (n == 2) return 2;
    for (let i=3; i<=n; ++i) {
       target = number1 + number2;
       number1 = number2;
       number2 = target;
    }
    return target;
 }

当N=10000时就已经越界了,会输出 Infinity。但浏览器不会卡死,值还是会瞬间输出。

三、变态青蛙跳台阶问题

如果青蛙一次可以跳一级台阶、二级台阶、或n级台阶,跳上n级台阶有多少种跳法?

jump(n) = jump(n - 1) + jump(n - 2) + jump(n - 3) + ... + jump(2) + jump(1)

function jump(n) {
    if (n <= 0) return -1;
    if (n == 1) return 1;
    if (n == 2) return 2;
    let result = 0;
    for (let i = 1; i < n; i ++) {
        result += jump(n - i);
    }
    return result + 1; // +1是从0级台阶直接跳上去的情况
}