当前位置:首页 > JavaScript

js实现fibonacci

2026-04-06 01:56:19JavaScript

Fibonacci数列简介

Fibonacci数列是一个经典的数学序列,其定义如下:F(0) = 0,F(1) = 1,F(n) = F(n-1) + F(n-2)(n ≥ 2)。在JavaScript中可以通过多种方式实现Fibonacci数列的计算。

递归实现

递归是最直观的实现方式,但性能较差,时间复杂度为O(2^n),不适合计算较大的n值。

function fibonacciRecursive(n) {
    if (n <= 1) return n;
    return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
}
console.log(fibonacciRecursive(10)); // 输出55

迭代实现

迭代方式通过循环计算Fibonacci数列,时间复杂度为O(n),性能优于递归。

function fibonacciIterative(n) {
    let a = 0, b = 1, temp;
    for (let i = 0; i < n; i++) {
        temp = a;
        a = b;
        b = temp + b;
    }
    return a;
}
console.log(fibonacciIterative(10)); // 输出55

动态规划实现

动态规划通过存储中间结果避免重复计算,时间复杂度为O(n),空间复杂度也为O(n)。

js实现fibonacci

function fibonacciDP(n) {
    const dp = [0, 1];
    for (let i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n];
}
console.log(fibonacciDP(10)); // 输出55

优化的动态规划实现

通过仅保存前两个值,可以将空间复杂度优化为O(1)。

function fibonacciOptimized(n) {
    if (n <= 1) return n;
    let prev = 0, curr = 1;
    for (let i = 2; i <= n; i++) {
        const next = prev + curr;
        prev = curr;
        curr = next;
    }
    return curr;
}
console.log(fibonacciOptimized(10)); // 输出55

闭包实现

利用闭包可以缓存计算结果,避免重复计算,适合多次调用的情况。

const fibonacciClosure = (function() {
    const cache = [0, 1];
    return function(n) {
        if (cache[n] !== undefined) return cache[n];
        cache[n] = fibonacciClosure(n - 1) + fibonacciClosure(n - 2);
        return cache[n];
    };
})();
console.log(fibonacciClosure(10)); // 输出55

矩阵快速幂实现

矩阵快速幂是一种高效的算法,时间复杂度为O(log n),适合计算非常大的n值。

js实现fibonacci

function multiply(a, b) {
    return [
        [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]]
    ];
}

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

function fibonacciMatrix(n) {
    if (n <= 1) return n;
    const mat = [[1, 1], [1, 0]];
    const result = matrixPower(mat, n - 1);
    return result[0][0];
}
console.log(fibonacciMatrix(10)); // 输出55

生成器实现

使用生成器可以按需生成Fibonacci数列,适合需要逐个获取的场景。

function* fibonacciGenerator() {
    let [a, b] = [0, 1];
    while (true) {
        yield a;
        [a, b] = [b, a + b];
    }
}

const gen = fibonacciGenerator();
for (let i = 0; i <= 10; i++) {
    console.log(gen.next().value); // 输出0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
}

尾递归优化实现

某些JavaScript引擎支持尾递归优化,可以减少递归调用的堆栈开销。

function fibonacciTailRecursive(n, a = 0, b = 1) {
    if (n === 0) return a;
    if (n === 1) return b;
    return fibonacciTailRecursive(n - 1, b, a + b);
}
console.log(fibonacciTailRecursive(10)); // 输出55

性能比较

对于小规模的n值(如n < 20),递归实现足够简单且性能尚可。对于中等规模的n值(如20 ≤ n ≤ 1000),迭代或动态规划实现更优。对于大规模的n值(如n > 1000),矩阵快速幂实现性能最佳。

注意事项

递归实现虽然简洁,但可能导致堆栈溢出或性能问题。在实际应用中应根据需求选择合适的实现方式。

标签: jsfibonacci
分享给朋友:

相关文章

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…