算法之斐波那契数列

197 阅读2分钟

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

简单递归

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

递归解法的主要问题在于:

  1. 调用栈不断的叠加
  2. 大量重复的计算

递归优化(尾递归)

funciton fib(n, pre, cur){
    if(n === 0) return pre
    if(n === 1) return cur
    return fn(n - 1, cur, cur + pre)
}
console.log(Date.now())
console.log(fib(500, 0, 1))
console.log(Date.now())
//1649701210783
//1.394232245616977e+104
//1649701210786

递归优化(备忘录解法)

let fib = (function () {
    let map = {}
    return function (n) {
        if (map[n]) return map[n]
        if (n === 0) return map[0] = 0
        if (n === 1) return map[1] = 1
        return map[n] = fib(n - 1) + fib(n - 2)
    }
})()
console.log(Date.now())
console.log(fib(500))
console.log(Date.now())
// 1649699946267
// 1.394232245616977e+104
// 1649699946271

动态规划

let fib = function(n){
    let next = 1n, pre = 0n
    for(let i = 0; i < n; i++){
        [next, pre] = [next + pre, next]
    }
    return pre
}
console.log(Date.now())
console.log(fib(500))
console.log(Date.now())
// 1649699946271
// 139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125n
// 1649699946271

以上全部内容,如有疑问,欢迎指正。Good Luck!

13.webp