JS实现斐波那契数列的几种方法及代码优化
一、斐波那契数定义
斐波那契数列又被称为黄金分割数列,指 1,1,2,3,5,8,13,21,... 等数列。
在数学中有递推的方法定义: F(0)=0,F(1)=1, F(2)=1,F(n)=F(n-1)+F(n-2), ( n ≥ 2, n ∈ N* )
数列从第三项开始,每项等于前两项之和,以此类推。
二、实现方法(递归和循环)
1. 递归计算
1 function fibonacci(n) {
2 if(n < 0)throw new Error('需大于0');
3 if (n == 1 || n == 2) {
4 return 1
5 };
6 return fibonacci(n - 1) + fibonacci(n - 2);
7 }
8 fibonacci(10);
优点:代码简洁易懂;
缺点:数值越大时,每次进行重复计算,消耗内存,导致浏览器卡死情况;
2. 递归计算,使用闭包保存到数组
1 function fibonacci(n){
2 if(n < 0) throw new Error('需大于0');
3 let arr = [0,1];
4 const calc = (n)=>{
5 if(n < 2){
6 return arr[n];
7 }
8 if(arr[n] != undefined){
9 return arr[n];
10 }
11 let data = calc(n-1) + calc(n-2);
12 arr[n] = data;
13 return data;
14 }
15 return calc(n);
16 }
优化No.1的缺点,避免重复计算。
3. 循环计算,使用数组实现
1 function fibonacci(n){
2 const arr = [0,1,1];
3 if(n<0)throw new Error('需大于0');
4 if(n>2){
5 for(let i=3;i<=n;i++){
6 arr[i]=arr[i-1]+arr[i-2];
7 }
8 }
9 return arr[n]
10 }
11 fibonacci(10);
和No.2方式一样,将计算过的值存储到数组中,避免重复计算;
4. 循环计算,使用变量实现
1 function fibonacci(n){
2 let prev=0;curr=1;total=0; // 初始值
3 if(n<0)throw new Error('需大于0');
4 if(n >= 0 && n <= 1)return n; 6 for(let i = 2;i<=n;i++){
7 total=prev+curr;
8 prev=curr;
9 curr=total;
10 }
11 return total;
12 }
13 fibonacci(10); // 55 ?
5. 循环计算,使用ES6变量的解构赋值实现
1 function fibonacci(n) {
2 let n1 = 1; n2 = 1;
3 for (let i = 2; i < n; i++) {
4 [n1, n2] = [n2, n1 + n2]
5 }
6 return n2;
7 }
8 fibonacci(10); // 55 ?
同上,换了实现方法;
6. 循环计算,使用Generator函数
1
2 function* fibonacci(){
3 let [prev, curr] = [0,1];
4 for(;;){
5 yield curr;
6 [prev,curr]=[curr, prev+curr];
7 }
8 }
9 const arr=[];
10 for(let n of fibonacci()){
11 if(n>30)break; // 传递的是n以内的数列
12 arr.push(n); // 不需要使用next(),得到斐波那契数列
13 }
14 const total = arr.reduce((val,cur)=>val+cur,0); // 计算数列总数
15 console.log( total); // 54
16
知识点: Generator函数、 for...of 、 reduce()
三、问题点
generator*()得到的数列是: 1,1,2,3,5,8,13,21
计算数列之和结果是54,其他方式计算结果是55,
有大佬可以解惑吗 /(ㄒoㄒ)/~~
有问题评论指出虚心接受,欢迎交流喔。(●'◡'●)
JS实现斐波那契数列的几种方法及代码优化的更多相关文章
- JS实现斐波那契数列的几种方法
斐波那契数列指的是这样一个数列:1.1.2.3.5.8.13.21.34.…… 前两项为1,从第三项起,每一项等于前两项的和,即F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n& ...
- JS写斐波那契数列的几种方法
斐波那契数,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字 ...
- JS实现斐波那契数列的五种方式
下面是五种实现斐波那契数列的方法 循环 function fibonacci(n){ var res1 = 1; var res2 = 1; var sum = res2; for(var i = ...
- 方法输出C++输出斐波那契数列的几种方法
PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 定义: 斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, ...
- C++输出斐波那契数列的几种方法
定义: 斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 这个数列从第三项开始,每一项都等于前两项之和. 以输出斐波那 ...
- Python中斐波那契数列的四种写法
在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,“你学过数据结构吗?”我略略点一点头 ...
- 斐波那契数列的5种python实现写法
斐波那契数列的5种python写法 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖 ...
- 斐波那契数列的三种C++实现及时间复杂度分析
本文介绍了斐波那契数列的三种C++实现并详细地分析了时间复杂度. 斐波那契数列定义:F(1)=1, F(2)=1, F(n)=F(n-1) + F(n-2) (n>2) 如何计算斐波那契数 F( ...
- JS 从斐波那契数列浅谈递归
一.前言 昨晚下班后,经理出于兴趣给我们技术组讲了讲算法相关的东西,全程一脸懵逼的听,中途还给我们出了一道比较有趣的爬楼问题,问题如下: 假设一个人从地面开始爬楼梯,规定一步只能爬一坎或者两坎,人只能 ...
- 斐波那契数列 的两种实现方式(Java)
import java.util.Scanner; /* 斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 如果设F(n)为该数列的第n ...
随机推荐
- reduce() 多种用法
reduce()方法用于将数组简化为单一值,通过遍历数组并应用提供的函数.它可以用于求和.乘积.计算对象属性的总和.数组去重和转换数组结构等.初始值的设置会影响reduce的起始索引.不提供初始值时, ...
- 瑞芯微 | I2S-音频基础 -1
最近调试音频驱动,顺便整理学习了一下i2s.alsa相关知识,整理成了几篇文章,后续会陆续更新. 喜欢嵌入式.Li怒晓得老铁可以关注一口君账号. 1. 音频常用术语 名称 含义 ADC(Analog ...
- 一个能够生成 Markdown 表格的 Bash 脚本
哈喽大家好,我是咸鱼. 今天分享一个很实用的 bash 脚本,可以通过手动提供单元格内容和列数或者将带有分隔符的文件(如 CSV.TSV 文件)转换为 Markdown 表格. 源代码在文末哦!原文链 ...
- Win32 API 读取文件
昨天又用Win32来读取文件的时候,又出现了字符编码的问题. 用TCHAR字符来写文件呢,用系统的记事本打开是乱码. 用CHAR字字符来写呢,在读取汉字的时候后面有一串乱码, 用CHAR[]数组读取就 ...
- 解决gedit报错无法打开的问题
彻底解决关于gedit的Unable to init server: 无法连接: 拒绝连接_BD_Marathon的博客-CSDN博客_unable to init server: 无法连接: 拒绝连 ...
- python配置pip镜像
Python配置pip的镜像 国内的网络通过pip下载软件包只有不到10k的下载速度.不仅下载的慢,还容易引发超时错误,导致下载失败.而将给pip配置国内的镜像源可以完美的解决这个问题.本文讲解了pi ...
- 1055 - Expression #9 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx.xxx.xxx' which is not functionally ...;this is incompatible with sql_mode=only_full_group_by
MySQL 8 的默认 sql_mode 包含了only_full_group_by,如果想要sql不按照这模式做检查,可以设置当前session的sql_mode值不包含oly_full_group ...
- Java并发编程之验证volatile指令重排-理论篇
Java并发编程之验证volatile指令重排-理论篇 Java并发包下的类中大量使用了volatile关键字.通过之前文章介绍,大家已经知道了volatile的三大特性:共享变量可见性:不保证原子性 ...
- bug记录|NON-STATIC METHOD CANNOT BE REFERENCED FROM A STATIC CONTEXT
bug记录|NON-STATIC METHOD CANNOT BE REFERENCED FROM A STATIC CONTEXT 问题:原因:静态方法无法调用自己定义的非静态方法 解决方案:1 ...
- echarts的x轴显示不全的解决办法
echarts的x轴显示不全的解决办法 一.背景 当x轴类目较多时,label显示时会自动间隔显示,也就是会隐藏掉中间的label,如下图: 二.解决办法 通过设置 xAxis.axisLabel.i ...