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

453 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

const fib = (n) => {
    if(n <= 2) return 1;
    return fib(n-1) + fib(n-2)
};

用文字来说,就是斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。我们图解形式将计算斐波那契数列中某一个数计算过程

001.png

通过一个递归来实现,首先这里给出一个 base case 用于判断退出递归 if(n <= 2) return 1; 我们在设计递归函数需要考虑 3 件事,分别是退出或者叫做边界条件(base case),然后函数的参数和返回值都什么,以及每次层次逻辑是什么。

我们都知道斐波那契数列计算的时间复杂度为 O(2n)O(2^n) 而其空间复杂度为 O(n)O(n),下面

屏幕快照 2021-10-25 下午7.25.21.png

上边图给出时间复杂度为O(n)O(n),可能有些人会产生这样疑问,为什么介绍这个线性的复杂度呢,其实我们看到复杂时间度都是基于简单时间复杂度。

003.png

这里时间复杂度是 O(n/2)O(n/2) 但是因为常数时间复杂度可忽略不计所以这里时间复杂度也是 O(n)O(n)

005.png

006.png

上边我们分析了了进行两次时间复杂度dib(n1)dib(n-1)lib(n2)lib(n-2) 从而可以计算出fib(n1)+fib(n2)fib(n-1) + fib(n-2) 时间复杂度为他们之间所以是 O(2n)O(2^n)

002.png

const fib = (n) => {
    if(n <= 2) return 1;
    return fib(n-1) + fib(n-2)
};


const res = fib(6);
console.log(res);

const lineFunc = (n) => {
    if (n <= 1) return;
    lineFunc(n - 1);
}

const lineFunc2 = (n) => {
    if (n <= 1) return;
    lineFunc2(n-2);
}

const dib = (n) =>{
    if(n <=1 ) return;
    dib(n - 1);
    dib(n - 1);
}


const lib = (n) =>{
    if(n <=1 ) return;
    lib(n - 2);
    lib(n - 2);
}


我么设置缓存来解决递归的时间复杂度问题将时间复杂度从O(2n)O(2^n) 变为 O(n)O(n)

const fib = (n,memo = {}) => {
    if (n in memo) return memo[n]
    if (n <=2 ) return 1;
    memo[n] =  fib(n-1,memo) + fib(n-2,memo);
    return memo[n];
}


console.log(fib(50))

屏幕快照 2021-10-25 下午7.51.37.png