菲波列切函数,看这篇就可以了

229 阅读2分钟

斐波那契函数(Fibonacci Function)是一个经典的数学函数

定义如下:

  • ( F(0) = 0 )
  • ( F(1) = 1 )
  • ( F(n) = F(n-1) + F(n-2) ) 对于 ( n \geq 2 )

斐波那契数列的前几项是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

下面是一些用JavaScript实现斐波那契函数的方法:

1. 递归实现

递归实现是最直观的方法,但效率较低,因为会重复计算很多子问题。

function fibonacci(n) {
    if (n <= 1) {
        return n;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}

console.log(fibonacci(10)); // 输出 55

2. 动态规划实现

动态规划通过存储已经计算过的值来避免重复计算,提高了效率。

function fibonacci(n) {
    if (n <= 1) {
        return n;
    }
    let fib = [0, 1];
    for (let i = 2; i <= n; i++) {
        fib[i] = fib[i - 1] + fib[i - 2];
    }
    return fib[n];
}

console.log(fibonacci(10)); // 输出 55

3. 迭代实现

迭代实现也是一种高效的解决方案,只需要常数级别的额外空间。

function fibonacci(n) {
    if (n <= 1) {
        return n;
    }
    let a = 0, b = 1, c;
    for (let i = 2; i <= n; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return b;
}

console.log(fibonacci(10)); // 输出 55

4. 尾递归实现

尾递归是一种优化的递归方法,可以在某些编译器中优化为迭代,避免栈溢出。

function fibonacci(n, a = 0, b = 1) {
    if (n === 0) {
        return a;
    }
    if (n === 1) {
        return b;
    }
    return fibonacci(n - 1, b, a + b);
}

console.log(fibonacci(10)); // 输出 55

5. 使用矩阵快速幂

对于大数情况,可以使用矩阵快速幂来高效计算斐波那契数列。

function matrixMultiply(a, b) {
    const result = [
        [a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1]],
        [a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]]
    ];
    return result;
}

function matrixPower(matrix, n) {
    if (n === 1) {
        return matrix;
    }
    let result = [[1, 0], [0, 1]];
    while (n > 0) {
        if (n % 2 === 1) {
            result = matrixMultiply(result, matrix);
        }
        matrix = matrixMultiply(matrix, matrix);
        n = Math.floor(n / 2);
    }
    return result;
}

function fibonacci(n) {
    if (n <= 1) {
        return n;
    }
    const matrix = [[1, 1], [1, 0]];
    const result = matrixPower(matrix, n - 1);
    return result[0][0];
}

console.log(fibonacci(10)); // 输出 55

以上是几种常见的斐波那契函数实现方法。每种方法都有其适用的场景和优缺点。希望这些示例对你有所帮助。如果有任何疑问或需要进一步的解释,请随时提问。

PS:学会了记得,点赞,评论,收藏,分享