斐波那契数列(黄金分割数列)

189 阅读1分钟

定义

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。

数列第1和第2项为1,从第3项开始,每一项都等于前两项之和
1、1、2、3、5、8、13、21、34、...,n 

求斐波那契数列的第 n 项

解决方法

简单解决方法

function fib(n) {
    if (n===1 || n===2) {
        return 1;
    }
    return fib(n-1) + fib(n-2);
}

  • 时间复杂度:可以从图中看出我们要求第5项的话可以分解为第4项和第3项之和,由此类推。每一个父项都会裂变为2个子项。而树的高度为 n 减1,那么这里时间复杂 O(n) 为2的 n 次方
  • 空间复杂度:这里假如要求第5项,那么执行栈的要从求第4项-->第3项-->第2项,到达第2项以后即到达出口,那么这里压栈的深度为n-1, 即空间复杂度 O(n) 为 n

总结:随着n的增长,计算n项所选的时间就会越多

利用缓存结果解决方法

将函数执行结果用变量缓存起来的方法。当函数进行计算之前,先看缓存对象中是否有次计算结果,如果有,就直接从缓存对象中获取结果;如果没有,就进行计算,并将结果保存到缓存对象中。

const fib = (function () {
    const memo = {
        1: 1,
        2: 1,
    };
    return function _getFib(n){
        if (memo[n]) {
            return memo[n];
        }
        const res = _getFib(n-1) + _getFib(n-2);
        memo[n] = res;
        return memo[n]
    }
})()