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 ...
随机推荐
- Keil uVision5软件破解方法
1.正常下载软件 2.右键"管理员方式运行"软件 3.如下图"File"->"License..." 4.复制CID,管理员方式打开破 ...
- QT中TreeWidget树控件的使用
关于Item Widgets中Tree Widget的使用方法! TreeWidget树控件的使用 创建列表头, 该控件有什么属性 QStringList header_list; header_li ...
- RabbitMq高级特性之延迟队列 通俗易懂 超详细 【内含案例】
RabbitMq高级特性之延迟队列 介绍 消息进入队列后不能立即被消费,到达指定时间后才可被消费 实现 结合以下两种即可达到延迟队列 RabbitMq高级特性之TTL过期时间 RabbitMq高级特性 ...
- MPTCP(五):MPTCP路径管理工具iproute2/ip-mptcp编译及安装
简介 ip-mptcp是一个MPTCP路径管理工具,它可以决定哪些链路允许作为MPTCP子流存在 仅对MPTCPv1有效 在支持MPTCPv1的内核中使用man ip-mptcp可以查看相关帮助 gi ...
- Mac 删除 Steam 游戏图标
Steam 将游戏安装在了 ~/Applications,打开访达,前往该目录,将相关游戏移到废纸篓.
- 折腾 Quickwit,Rust 编写的分布式搜索引擎 - 可观测性之分布式追踪
概述 分布式追踪是一种跟踪应用程序请求流经不同服务(如前端.后端.数据库等)的过程.它是一个强大的工具,可以帮助您了解应用程序的工作原理并调试性能问题. Quickwit 是一个用于索引和搜索非结构化 ...
- 【Docker学习教程系列】7-如何将本地的Docker镜像发布到阿里云
在上一篇中,我们使用docker commit 命令,创建了一个带有vim的Ubuntu镜像.那么怎么将这个镜像分享出去呢?本文就来讲解如何将本地的docker镜像发布到阿里云上. 本文主要内容: 1 ...
- 【SpringBoot Demo】MySQL + JPA + Hibernate + Springboot + Maven Demo
主要包含:springboot+jpa+hibernate+mysql+lombok (两年前写过一个,现在重新记录一个) 1. 目录结构: 2. pom 文件 1 <?xml version= ...
- 亮相CCIG2024,合合信息文档解析技术破解大模型语料“饥荒”难题
近日,2024中国图象图形大会在古都西安盛大开幕.本届大会由中国图象图形学学会主办,空军军医大学.西安交通大学.西北工业大学承办,通过二十多场论坛.百余项成果,集中展示了生成式人工智能.大模型 ...
- ASP.NET Core Library – MailKit SMTP Client
前言 以前写的 SMTP Client 相关文章: Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 ) ASP.NET Email ...