JavaScript实现斐波那契数列及性能优化详解

作者:白帽猫时间:2026-10-26 09:31:44浏览:387

本文介绍JavaScript中计算斐波那契数列第n项的两种实现方式。首先展示基础递归代码,分析其因栈空间重复开辟导致的时空复杂度高的问题;随后通过引入数组进行记忆化存储,将数据从栈移至堆空间,显著降低调用次数并解决栈溢出风险,提供高效求值方案。

JavaScript计算斐波那契数列第n项的值

function myFibonacci(n) {
	if(n < 0){return;}
	if(n === 0){ return 0;}
	if(n === 1){ return 1;}
	if(n > 1){
		return myFibonacci(n-1) + myFibonacci(n-2);
	}
}

在JavaScript中,求解斐波那契数列(Fibonacci)的第n个数值是多少?

// **3 求斐波那契数列Fibonacci中的第n个数是多少?**
    // > 1 1 2 3 5 8 13 21...
    // > f(n)=f(n-1)+f(n-2)
    // >
    // > f(1)=f(2)=1
        function getFib(n) {
            var n1 = 1;//储存f-2
            var n2 = 1;//储存f-1
            var n3 = 0;//储存取得值
            //i=2,因为第一个算的就是第三个的值
            for(var i = 2; i < n; i++) {
                n3 = n1 + n2;
                //为取下一个值做准备,原来的n-1变成n-2,当前取出的值变成了下一个的n-1
                n1 = n2;
                n2 = n3;
            }
            return n3;

JavaScript实现斐波那契数列求项及优化

斐波那契数列

每一位接触算法的开发者都会遇到这道经典题目:斐波那契数列。

该数列规律简单明确:前两项值为1,从第三项起,每一项的值等于其前两项之和。实现这一逻辑并不复杂。

function fib(n){
    if (n===1 || n===2){//判断项所在位置,如果为第一第二项,返回1
        return 1;
    } else{
        return fib(n-1)+fib(n-2);//位置在第三项及以后,返回前两项和
    }
}
console.log(fib(5));

以下代码展示了在JS中简单求解斐波那契数列某一项值的方法;

然而,该代码的缺陷十分明显,其时间与空间复杂度极高;我们可以定义一个变量 i 来观察执行情况。

let =0;
function fib(n){
    i++;
    if (n===1 || n===2){//判断项所在位置,如果为第一第二项,返回1
        return 1;
    } else{
        return fib(n-1)+fib(n-2);//位置在第三项及以后,返回前两项和
    }
}
console.log(fib(5));
console.log(i);

JavaScript计算斐波那契数列第n项的值

从图片中可以看到,当 n 的值为 40 时,i 的值高达 204668309,这意味着在求解斐波那契第 40 项时,函数被调用的次数极为庞大;

由于字符串具有不可变性,在尚未找到递归出口前,系统会不断在栈上开辟新空间以存储数据,这也是导致栈溢出的主要原因。

优化

发现问题后需进行优化,核心性能瓶颈在于数据存储会不断开辟新空间,导致空间复杂度上升。解决方法简单直接:定义一个空数组来存储斐波那契数列的项。因为数组属于复杂类型,存储在堆内存中,且仅在 new 时创建新的存储空间,我们只需在栈上建立索引来访问该数组即可。

//定义存储斐波那契数列项数组
let result = [];
let i=0;
function sum(a) {
    i++;
    //首先判断数组内有没有当前斐波那契数列项,如果有直接从数组获取;没有则将该项push进数组,再从数组过去该项
    if (result[a] !== undefined){
        return result[a];
    } else{
        if (a===1 || a===2){
            result[a] = 1;
            return 1;
        } else{
            result[a] = sum(a-1)+sum(a-2);
            return result[a];
        }
    }
}
console.log(sum(1476));
console.log(i);

上述代码即为优化后的版本,实现简单,仅需添加一个数组用于存储斐波那契数列项。效果显著;

以下是求解第 1476 项时 i 的值:

JavaScript计算斐波那契数列第n项的值

以上即为斐波那契数列求项的实现及优化代码。

总结

以上为个人经验总结,希望能给大家提供参考,也希望大家多多支持本站。

作者最新文章