js如何计算斐波那契数列第n项的值

 更新时间:2023年01月17日 14:42:47   作者:淡定如斯  
这篇文章主要介绍了js如何计算斐波那契数列第n项的值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

js计算斐波那契数列第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);
	}
}

js求斐波那契数列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;

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

斐波那契数列

相信每一个接触算法的人都会遇到一道经典的算法问题,斐波那契数列。

斐波那契数列的规律也很简单,就是第一第二项值为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);

在这个图片里面我们可以看到,当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 的值:

上面就是斐波那契数列求项的实现以及优化代码

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 微信小程序 wx:for遍历循环使用实例解析

    微信小程序 wx:for遍历循环使用实例解析

    这篇文章主要介绍了微信小程序 wx:for遍历循环使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 小程序实现上传视频功能

    小程序实现上传视频功能

    这篇文章主要为大家详细介绍了小程序实现上传视频功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • JS组件封装之监听localStorage的变化

    JS组件封装之监听localStorage的变化

    这篇文章主要介绍了JS组件封装之监听localStorage的变化,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • typescript配置alias的详细步骤

    typescript配置alias的详细步骤

    这篇文章主要介绍了typescript配置alias,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 显示/隐藏侧边栏

    显示/隐藏侧边栏

    显示/隐藏侧边栏...
    2006-10-10
  • Javascript中的神器——Promise

    Javascript中的神器——Promise

    本文主要介绍了Javascript中Promise的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • JavaScript获取一个范围内日期的方法

    JavaScript获取一个范围内日期的方法

    这篇文章主要介绍了JavaScript获取一个范围内日期的方法,涉及javascript操作日期的相关技巧,需要的朋友可以参考下
    2015-04-04
  • webpack4之如何编写loader的方法步骤

    webpack4之如何编写loader的方法步骤

    这篇文章主要介绍了webpack4之如何编写loader,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • js 纯数字不重复排列的另类方法

    js 纯数字不重复排列的另类方法

    有一组数据,大概10万个左右,每一单位的值不会大于30000,要求按照由大到小的顺序不重复输出。
    2010-07-07
  • JS数组splice操作实例分析

    JS数组splice操作实例分析

    这篇文章主要介绍了JS数组splice操作,结合实例形式分析了javascript使用splice方法删除数组元素相关操作技巧,需要的朋友可以参考下
    2019-10-10

最新评论