斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……从数列可以看出,从第三项开始,每一项都是前两项的和,f(n) = f(n-1) + f(n-2)
那么用js怎么求斐波那契数列第n项的值呢?

1.普通递归计算:

function fibonacci(n){if(n == 1||n == 2) return 1return fibonacci(n - 1) + fibonacci(n - 2)
}
fibonacci(5)
// > 5
fibonacci(50)
// >       卡住了

当n等于1或者n等于2的时候,直接返回1,当n大于2的时候,就递归函数,每次返回前两个函数的结果,这就是最基础的斐波那契数列递归算法。但是大家都知道,函数运行的时候,会被放入函数执行栈运行,如果内部还有函数,那么就会继续入栈,直到最内部函数,然后再一个个出栈,直到栈清空,取得结果。把上边的函数放入控制台运行,就会发现,当n比较大的时候,大概50以上函数栈就会非常大,以至于计算机几分钟内不能算出结果。那么可想而知,当n越来越大的时候,用这个函数,几乎不能算出结果了。所以我们可以用尾递归去优化它。

2:尾递归计算:

function fibonacci(n,a1 = 1,a2 = 1){if(n == 1||n == 2) return a2return fibonacci(n - 1,a2,a1 + a2)
}
fibonacci(5)
>> 5
fibonacci(50)
>> 12586269025

从这个函数可以看出,我们的递归每次返回的时候,我们把计算结果传入下一个函数,return放在最后,只返回一个函数调用,那么上一个函数其实是已经结束了函数的调用的,此时他会从栈中弹出,那么函数执行栈始终只有一个。把这段函数复制到控制台运行,可以看出,即便是n很大,也能很快算出结果。
细心的同学可能发现了,这其实就是一个迭代啊,只不过把迭代计算放入了递归函数的参数中。

3:迭代计算:

function fibonacci(n){if(n == 1||n == 2) return 1let a1 = 1,a2 = 1for(i = 2;i < n;i++){[a1,a2] = [a2,a1+a2]}return a2
}
fibonacci(5)
>> 5
fibonacci(50)
>> 12586269025

普通的迭代计算,也可以很快计算出结果。

4:缓存计算结果:

function fibonacci(n){if(n == 1||n == 2) return 1if(!fibonacci[n+'']){fibonacci[n+''] = fibonacci(n - 1) + fibonacci(n - 2)}return fibonacci[n+'']
}
fibonacci(5)
>> 5
fibonacci(50)
>> 12586269025
fibonacci(100)
>> 354224848179262000000

这里咱们用缓存计算结果修改第一个普通递归,刚才分析了,普通递归因为函数执行栈太大以至于难以计算出n很大的结果,那么咱们用函数的属性,存放那些已经计算过的结果,如果有,就直接返回,没有的话,给对应的属性 n 赋值再返回,也可以很快计算出结果。但是给函数添加了很多属性,毕竟是占了不少空间,这属于用空间换时间的算法。具体用不用,就取决于使用者的空间成本和时间成本了。

当然,还有一些其他的算法,这里就不一一列举了。有更好算法的同学欢迎评论区留言。

上一篇:小数点保留两位的js正则表达式
下一篇:vue3 setup如何使用emit?

【js算法】js斐波那契数列的多种算法相关推荐

  1. 用数学公式算法求解斐波那契数列

    目录 用数学公式算法求解斐波那契数列 程序设计 程序分析 用数学公式算法求解斐波那契数列 [问题描述]给定n,n小于90,打印出前n+1个斐波那契数.从第0个开始,即F(0)=0

  2. 斐波那契数列的迭代算法和递归算法

    斐波那契数列 斐波那契数列(Fibonacci sequence),又称"黄金分割数列",因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入, ...

  3. 斐波那契数列python递归 0、1、1、2、3_python实现斐波那契数列的多种方式

    正文共: 3269字 8图 预计阅读时间: 9分钟 每日分享 The great pleasure in life is doing what people say you cannot do. 人生 ...

  4. js迭代器实现斐波那契数列

    // 直接上代码 function lterator () {let arr = [0, 1]let index = 0return {next () {if (arr[index] === unde ...

  5. python编写递归函数和非递归函数、输出斐波那契数列_python 入门之斐波那契数列递归表达式算法和非递归算法...

    题目: 斐波那契数列是一组有规律的数列:1,1,2,3,5,8,13,--..,那么我们怎么用python 来完成此算法,并求出第200位的值是多少 1.python 递归表达式实现: def fib ...

  6. 【超直白】算法:斐波那契数列

    题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 分析: 何为斐波那契额数列呢?? 例如:0 1 1 2 3 5 8 1 ...

  7. 斐波那契数列-爬楼梯算法

    爬楼梯算法 有n级楼梯,有2种爬法,1次1级,或1次2级,问,n级楼梯有多少种爬法? 递归求解 首先,当只有一阶楼梯的时候,很显然只有一种走法:有两阶楼梯的时候,也很显然的知道有两种走法.就会有下面这 ...

  8. 斐波那契数列(Fibonacci) - 这就是算法吗?爱了爱了

    斐波那契数列(Fibonacci) 今天开始做牛客的剑指Offie,一看到斐波那契我就想到递归,是它是它就是它,然后我就满怀期待地写下了下面地代码.ok,没问题,一次性过.然而,我滴老天鹅,才击败30 ...

  9. 求解斐波那契数列(Fibonacci Numbers)算法居然有9种,你知道哪几种吗?

    By LongLuo 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为&q ...

最新文章

  1. Redis 限流的 3 种方式,还有谁不会!
  2. matlab如何模拟竹蜻蜓飞行,JSBSim_Matlab 将 与 进行联合仿真 模拟飞行计算 247万源代码下载- www.pudn.com...
  3. 3DSlicer27:OpenIGTLinkIF
  4. Hadoop的数据管理
  5. 响应文件是不是标书_什么是标书?投标书有哪些分类?标书和投标书的不同?...
  6. mysql 定时同步数据_MySQL数据同步之otter
  7. bash shell 中时间操作常用方法总结
  8. 【POJ - 2752】Seek the Name, Seek the Fame (KMP,公共前缀后缀长度及个数)
  9. 基于Caffe的人脸识别实现
  10. Redis3.0--集群安装部署
  11. Qt QSsh 使用 windows Qt实现ssh客户端
  12. 专用集成电路设计实用教程(学习笔记一)
  13. 功能测试Ⅱ——测试用例设计方法
  14. 验证性因素分析AVE和CR值
  15. 直连测速服务器异常,求证! 网件R7800, Speedtest测速的怪现象,200M宽带+R7800者进...
  16. 如何使用Keil5开发MSP430及Tiva系列开发板
  17. 影子口令(影子密码)
  18. MGC token GTR社区宇哥教你如何快速升级V5
  19. Qt操作Excel表格
  20. 操作系统基础(十)物理地址和虚拟地址

热门文章

  1. Kubernetes 当中启用IPVS模式
  2. 找到PHP工作并遇上心仪女孩,求大神支招怎么约饭?
  3. 烟草计算机考试考啥,烟草局考试计算机专业考试题-20210704194407.docx-原创力文档...
  4. python3用suds调用webService, 当参数是对象数组时
  5. 【latex】公式中的直体和斜体
  6. Xposed模块开发教程
  7. RK3568平台(PMU:Rk817)去掉电池之后,系统无法开机的解决方法
  8. java adb 外置sd,关于合并SD卡和选择外部存储的亲身经验(重要原创)
  9. apple企业开发账号的用途
  10. mac安装jdkidea配置jdk