当前位置:首页 > 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实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <htm…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…