一、斐波那契数定义

  斐波那契数列又被称为黄金分割数列,指 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. Apache DolphinScheduler如何开启开机自启动功能?

    转载自东华果汁哥 Apache DolphinScheduler 是一个分布式.去中心化的大数据工作流调度系统,支持大数据任务调度.若要设置 DolphinScheduler 开机自启动,通常需要将其 ...

  2. 代码随想录Day10

    232.用栈实现队列 请你仅使用两个栈实现先入先出队列.队列应当支持一般队列支持的所有操作(push.pop.peek.empty): 实现 MyQueue 类: void push(int x) 将 ...

  3. SpringBoot 整合线程池

    分为三步 启动类加 @EnableAsync 注解 在方法上加 @Async 注解 创建线程池配置类 1.启动类加 @EnableAsync 注解 @SpringBootApplication @En ...

  4. kubernetes负载感知调度

    背景 kubernetes 的原生调度器只能通过资源请求来调度 pod,这很容易造成一系列负载不均的问题, 并且很多情况下业务方都是超额申请资源,因此在原生调度器时代我们针对业务的特性以及评估等级来设 ...

  5. ARM汇编:MRS和MSR指令

    1.MSR和MRS指令介绍 MRS 指令:  对状态寄存器CPSR和SPSR进行读操作.通过读CPSR可以获得当前处理器的工作状态.读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有 ...

  6. 【VMware VCF】VMware Cloud Foundation Part 07:管理工作负载域中的主机和集群。

    一个标准 VMware Cloud Foundation 实例中具有管理工作负载域和 VI 工作负载域两种类型,管理域有且只有一个,而 VI 域可以创建多个,每种工作负载域中可以具有多个 vSpher ...

  7. JavaScript设计模式样例十一 —— 外观模式

    外观模式(Facade Pattern) 定义:隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口. 目的:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得 ...

  8. 冲刺 NOIP 400pts + 之神仙专题

    冲刺专题之 \(DP\) \(T_A\) Helping People $$codeforces$$ 题意 给定一个长为 \(n\) 序列 \(A\) , 其中有 \(q\) 个区间 \([l , r ...

  9. 【测试平台开发】——06Flask后端api开发实战(三)——API接口关联数据库

    本章节演示如何创建接口服务,用接口关联数据库数据,包括get请求和post请求. 一.Flask-RESTful插件 restful api是用于在前端与后台进行通信的一套规范.使用这个规范可以让前后 ...

  10. 工作 6 年,@Transactional 注解用的一塌糊涂

    接手新项目一言难尽,别的不说单单就一个 @Transactional 注解用的一塌糊涂,五花八门的用法,很大部分还失效无法回滚. 有意识的在涉及事务相关方法上加@Transactional注解,是个好 ...