一、斐波那契数定义

  斐波那契数列又被称为黄金分割数列,指 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), ( ≥ 2,  ∈ 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实现斐波那契数列的几种方法及代码优化的更多相关文章

  1. 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& ...

  2. JS写斐波那契数列的几种方法

    斐波那契数,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字 ...

  3. JS实现斐波那契数列的五种方式

    下面是五种实现斐波那契数列的方法 循环   function fibonacci(n){ var res1 = 1; var res2 = 1; var sum = res2; for(var i = ...

  4. 方法输出C++输出斐波那契数列的几种方法

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 定义: 斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, ...

  5. C++输出斐波那契数列的几种方法

    定义: 斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 这个数列从第三项开始,每一项都等于前两项之和. 以输出斐波那 ...

  6. Python中斐波那契数列的四种写法

    在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,“你学过数据结构吗?”我略略点一点头 ...

  7. 斐波那契数列的5种python实现写法

    斐波那契数列的5种python写法       斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖 ...

  8. 斐波那契数列的三种C++实现及时间复杂度分析

    本文介绍了斐波那契数列的三种C++实现并详细地分析了时间复杂度. 斐波那契数列定义:F(1)=1, F(2)=1, F(n)=F(n-1) + F(n-2) (n>2) 如何计算斐波那契数 F( ...

  9. JS 从斐波那契数列浅谈递归

    一.前言 昨晚下班后,经理出于兴趣给我们技术组讲了讲算法相关的东西,全程一脸懵逼的听,中途还给我们出了一道比较有趣的爬楼问题,问题如下: 假设一个人从地面开始爬楼梯,规定一步只能爬一坎或者两坎,人只能 ...

  10. 斐波那契数列 的两种实现方式(Java)

    import java.util.Scanner; /* 斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 如果设F(n)为该数列的第n ...

随机推荐

  1. reduce() 多种用法

    reduce()方法用于将数组简化为单一值,通过遍历数组并应用提供的函数.它可以用于求和.乘积.计算对象属性的总和.数组去重和转换数组结构等.初始值的设置会影响reduce的起始索引.不提供初始值时, ...

  2. 瑞芯微 | I2S-音频基础 -1

    最近调试音频驱动,顺便整理学习了一下i2s.alsa相关知识,整理成了几篇文章,后续会陆续更新. 喜欢嵌入式.Li怒晓得老铁可以关注一口君账号. 1. 音频常用术语 名称 含义 ADC(Analog ...

  3. 一个能够生成 Markdown 表格的 Bash 脚本

    哈喽大家好,我是咸鱼. 今天分享一个很实用的 bash 脚本,可以通过手动提供单元格内容和列数或者将带有分隔符的文件(如 CSV.TSV 文件)转换为 Markdown 表格. 源代码在文末哦!原文链 ...

  4. Win32 API 读取文件

    昨天又用Win32来读取文件的时候,又出现了字符编码的问题. 用TCHAR字符来写文件呢,用系统的记事本打开是乱码. 用CHAR字字符来写呢,在读取汉字的时候后面有一串乱码, 用CHAR[]数组读取就 ...

  5. 解决gedit报错无法打开的问题

    彻底解决关于gedit的Unable to init server: 无法连接: 拒绝连接_BD_Marathon的博客-CSDN博客_unable to init server: 无法连接: 拒绝连 ...

  6. python配置pip镜像

    Python配置pip的镜像 国内的网络通过pip下载软件包只有不到10k的下载速度.不仅下载的慢,还容易引发超时错误,导致下载失败.而将给pip配置国内的镜像源可以完美的解决这个问题.本文讲解了pi ...

  7. 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 ...

  8. Java并发编程之验证volatile指令重排-理论篇

    Java并发编程之验证volatile指令重排-理论篇 Java并发包下的类中大量使用了volatile关键字.通过之前文章介绍,大家已经知道了volatile的三大特性:共享变量可见性:不保证原子性 ...

  9. bug记录|NON-STATIC METHOD CANNOT BE REFERENCED FROM A STATIC CONTEXT

    bug记录|NON-STATIC METHOD CANNOT BE REFERENCED FROM A STATIC CONTEXT   问题:原因:静态方法无法调用自己定义的非静态方法 解决方案:1 ...

  10. echarts的x轴显示不全的解决办法

    echarts的x轴显示不全的解决办法 一.背景 当x轴类目较多时,label显示时会自动间隔显示,也就是会隐藏掉中间的label,如下图: 二.解决办法 通过设置 xAxis.axisLabel.i ...