[路飞]斐波那契数你有几种解法

352 阅读1分钟

斐波那契数

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

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

递归

  1. 找到边界情况
  2. 然后第n个等于第n - 1 个 加上 第 n - 2个
function fib(n) {
    // step1
    if (n < 2) return n
    // step2
    return fib(n - 1) - fib(n - 2)
}

尾递归

记录第n - 1 和 n - 2 的值n1, n2, 从0开始变动n1, n2的值 等于 0 和 1的时候是边界情况

function fib(n, n1 = 1, n2 = 0) {
    if (n === 0) return n2
    if (n === 1) return n1
    
    return fib(n - 1, n1 + n2, n1)
}

递归

数数,用一个数组记录第n个的值,然后取第n个

function fib(n) {
    // 创建一个长度n - 1的数组, 因为要取第n个的值
    const ret = Array.from({ length: n + 1})
    // 边界情况
    ret[0] = 0
    ret[1] = 1
    // 比那里记录第i个应该是什么值
    for (let i = 2; i <= n; i++) {
        ret[i] = ret[i - 1] + ret[i - 2]
    }
    
    return ret[n]
}

递归优化

我们只用到了3个变量, 第n个, 第n-1个, 第n-2个,通过这3个变量的变动来确定第n个

function fib(n) {
    // 边界情况
    if (n < 2) return n
    // 3变量
    // n, n - 1, n - 2
    let r = 1, p = 1, q = 0
    for (let i = 2; i <=n; i++) {
        r = p + q
        q = p
        p = r
    }
    return r
}