斐波那契数列的算法和优化(JavaScript)

场景

有一个斐波那契数列,请写一个函数实现求第n项的值
什么是斐波那契数列:
   相信每一个接触算法的人都会遇到一道经典的算法问题,斐波那契数列。
	斐波那契数列的规律也很简单,就是第一、第二项值为0,1,第三项开始每一项值为该项前两项的和;实现起来也并不难。

递归实现

function fibonacci(n) {
    if(n==0 || n == 1)
        return n; // 结束条件
    return fibonacci(n-1) + fibonacci(n-2);
}

上述函数缺陷:假设n值特别大,使用递归计算,性能会非常低

// 下面我用一个变量进行计算函数调用执行次数
let i=0;
function fib(n){
    i++;
    if (n===1 ){//判断项所在位置,如果为第一,返回0
        return 0;
    }else if(n===2){
    	return 1;
    }else{
        return fib(n-1)+fib(n-2);//位置在第三项及以后,返回前两项和
    }
}
console.log(fib(40));
console.log(i);

在这里插入图片描述

优化

性能问题:   数据存储上会不断开辟新空间造成空间复杂度的提升
解决方法:定义一个空数组存储斐波那契数列项。因为数组是一个复杂类型存储在堆里面,而且需要new的时候才会去创建一个新的存储空间,我们只需要在栈上建立一个索引去访问该数组就可以。
//  定义存储斐波那契数列数组
let result = [];
let i=0; // 计算函数被调用的次数
function feibo(n) {
    i++;
    // 首先在数组中进行查找是否有当前的斐波那契数列项,有的话就不需要进行递归调用了
    // 没有的话则将该项push进数组,再从数组过去该项
    if (result[n] !== undefined){
        return result[n];
    } else{
    	if(n===1){
    		result[n] = 0;
            return 0;
    	}else if (n===2 || n===3){
            result[n] = 1;
            return 1;
        } else{
            result[n] = feibo(n-1)+feibo(n-2);
            return result[n];
        }
    }
}
console.log(feibo(40));
console.log(i);

在这里插入图片描述

上述代码解释:
计算feibo(5)时 要计算feibo(4)+feibo(3) 而feibo(4)= feibo(3)+feibo(2)
如果按照上面的代码feibo(3) 会计算两次。我们可以把已经计算过存储在一个数组中,在需要的时候直接用,不用重新计算。
实现思路: 定义一个缓存数组,存储已经计算过的数列
每次计算前看看数组里有没有,如果有直接用
如果没有就计算,然后存在数组,以便下一次计算使用

在这里插入图片描述
同样可以使用for循环实现

function feibo(n){
    var res = [0,1]; // 定义一个数组
    if (n==1) {
    	return 0;
    }
    if(n == 2){
        return 1;
    }
    for(var i=2; i<n; i++){
        res.push(res[i-1]+res[i-2]);
    }
    return res[n-1];
}
console.log(feibo(40));

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值