一、斐波那契数定义

  斐波那契数列又被称为黄金分割数列,指 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. Keil uVision5软件破解方法

    1.正常下载软件 2.右键"管理员方式运行"软件 3.如下图"File"->"License..." 4.复制CID,管理员方式打开破 ...

  2. QT中TreeWidget树控件的使用

    关于Item Widgets中Tree Widget的使用方法! TreeWidget树控件的使用 创建列表头, 该控件有什么属性 QStringList header_list; header_li ...

  3. RabbitMq高级特性之延迟队列 通俗易懂 超详细 【内含案例】

    RabbitMq高级特性之延迟队列 介绍 消息进入队列后不能立即被消费,到达指定时间后才可被消费 实现 结合以下两种即可达到延迟队列 RabbitMq高级特性之TTL过期时间 RabbitMq高级特性 ...

  4. MPTCP(五):MPTCP路径管理工具iproute2/ip-mptcp编译及安装

    简介 ip-mptcp是一个MPTCP路径管理工具,它可以决定哪些链路允许作为MPTCP子流存在 仅对MPTCPv1有效 在支持MPTCPv1的内核中使用man ip-mptcp可以查看相关帮助 gi ...

  5. Mac 删除 Steam 游戏图标

    Steam 将游戏安装在了 ~/Applications,打开访达,前往该目录,将相关游戏移到废纸篓.

  6. 折腾 Quickwit,Rust 编写的分布式搜索引擎 - 可观测性之分布式追踪

    概述 分布式追踪是一种跟踪应用程序请求流经不同服务(如前端.后端.数据库等)的过程.它是一个强大的工具,可以帮助您了解应用程序的工作原理并调试性能问题. Quickwit 是一个用于索引和搜索非结构化 ...

  7. 【Docker学习教程系列】7-如何将本地的Docker镜像发布到阿里云

    在上一篇中,我们使用docker commit 命令,创建了一个带有vim的Ubuntu镜像.那么怎么将这个镜像分享出去呢?本文就来讲解如何将本地的docker镜像发布到阿里云上. 本文主要内容: 1 ...

  8. 【SpringBoot Demo】MySQL + JPA + Hibernate + Springboot + Maven Demo

    主要包含:springboot+jpa+hibernate+mysql+lombok (两年前写过一个,现在重新记录一个) 1. 目录结构: 2. pom 文件 1 <?xml version= ...

  9. 亮相CCIG2024,合合信息文档解析技术破解大模型语料“饥荒”难题

        近日,2024中国图象图形大会在古都西安盛大开幕.本届大会由中国图象图形学学会主办,空军军医大学.西安交通大学.西北工业大学承办,通过二十多场论坛.百余项成果,集中展示了生成式人工智能.大模型 ...

  10. ASP.NET Core Library – MailKit SMTP Client

    前言 以前写的 SMTP Client 相关文章: Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 ) ASP.NET Email ...