【js算法】js斐波那契数列的多种算法
斐波那契数列(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斐波那契数列的多种算法相关推荐
- 用数学公式算法求解斐波那契数列
目录 用数学公式算法求解斐波那契数列 程序设计 程序分析 用数学公式算法求解斐波那契数列 [问题描述]给定n,n小于90,打印出前n+1个斐波那契数.从第0个开始,即F(0)=0
- 斐波那契数列的迭代算法和递归算法
斐波那契数列 斐波那契数列(Fibonacci sequence),又称"黄金分割数列",因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入, ...
- 斐波那契数列python递归 0、1、1、2、3_python实现斐波那契数列的多种方式
正文共: 3269字 8图 预计阅读时间: 9分钟 每日分享 The great pleasure in life is doing what people say you cannot do. 人生 ...
- js迭代器实现斐波那契数列
// 直接上代码 function lterator () {let arr = [0, 1]let index = 0return {next () {if (arr[index] === unde ...
- python编写递归函数和非递归函数、输出斐波那契数列_python 入门之斐波那契数列递归表达式算法和非递归算法...
题目: 斐波那契数列是一组有规律的数列:1,1,2,3,5,8,13,--..,那么我们怎么用python 来完成此算法,并求出第200位的值是多少 1.python 递归表达式实现: def fib ...
- 【超直白】算法:斐波那契数列
题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 分析: 何为斐波那契额数列呢?? 例如:0 1 1 2 3 5 8 1 ...
- 斐波那契数列-爬楼梯算法
爬楼梯算法 有n级楼梯,有2种爬法,1次1级,或1次2级,问,n级楼梯有多少种爬法? 递归求解 首先,当只有一阶楼梯的时候,很显然只有一种走法:有两阶楼梯的时候,也很显然的知道有两种走法.就会有下面这 ...
- 斐波那契数列(Fibonacci) - 这就是算法吗?爱了爱了
斐波那契数列(Fibonacci) 今天开始做牛客的剑指Offie,一看到斐波那契我就想到递归,是它是它就是它,然后我就满怀期待地写下了下面地代码.ok,没问题,一次性过.然而,我滴老天鹅,才击败30 ...
- 求解斐波那契数列(Fibonacci Numbers)算法居然有9种,你知道哪几种吗?
By LongLuo 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为&q ...
最新文章
- Redis 限流的 3 种方式,还有谁不会!
- matlab如何模拟竹蜻蜓飞行,JSBSim_Matlab 将 与 进行联合仿真 模拟飞行计算 247万源代码下载- www.pudn.com...
- 3DSlicer27:OpenIGTLinkIF
- Hadoop的数据管理
- 响应文件是不是标书_什么是标书?投标书有哪些分类?标书和投标书的不同?...
- mysql 定时同步数据_MySQL数据同步之otter
- bash shell 中时间操作常用方法总结
- 【POJ - 2752】Seek the Name, Seek the Fame (KMP,公共前缀后缀长度及个数)
- 基于Caffe的人脸识别实现
- Redis3.0--集群安装部署
- Qt QSsh 使用 windows Qt实现ssh客户端
- 专用集成电路设计实用教程(学习笔记一)
- 功能测试Ⅱ——测试用例设计方法
- 验证性因素分析AVE和CR值
- 直连测速服务器异常,求证! 网件R7800, Speedtest测速的怪现象,200M宽带+R7800者进...
- 如何使用Keil5开发MSP430及Tiva系列开发板
- 影子口令(影子密码)
- MGC token GTR社区宇哥教你如何快速升级V5
- Qt操作Excel表格
- 操作系统基础(十)物理地址和虚拟地址
热门文章
- Kubernetes 当中启用IPVS模式
- 找到PHP工作并遇上心仪女孩,求大神支招怎么约饭?
- 烟草计算机考试考啥,烟草局考试计算机专业考试题-20210704194407.docx-原创力文档...
- python3用suds调用webService, 当参数是对象数组时
- 【latex】公式中的直体和斜体
- Xposed模块开发教程
- RK3568平台(PMU:Rk817)去掉电池之后,系统无法开机的解决方法
- java adb 外置sd,关于合并SD卡和选择外部存储的亲身经验(重要原创)
- apple企业开发账号的用途
- mac安装jdkidea配置jdk