快过年了,公司人基本上都走光了,只有共和国最优秀的人才,各部门最重要的岗位才会坚守在各自的转椅上,毕竟每个人的能力有限,与其让他们继续工作,不如放他们回家过年。这觉悟很高,这领悟很痛~

    闲着没事做(其实我有事情做,但是我不想做,做为社会主义的接班人,我想我有权利这么任性!),想起了一个挺有意思的兔子问题:一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?

  首先明确题意,是求每个月兔子的总对数。将兔子分成三种,兔子出生第一个月为小兔子,第二个月为中兔子,第三个月为大兔子(可以繁殖小兔子了),所以第一个月兔子的对数为:1、0、0;第二个月兔子的总对数为0、1、0;第三个月兔子的对数为1、0、1;第四个月的兔子对数为:1、1、1;第五个月兔子的对数为:2、1、2;第六个月:3、2、3;第七个月:5、3、5;第七个月:8、5、8....由此可知每个月对应的兔子对数是:1、1、2、3、5、8、13... 仔细观察每个月兔子的对数,从第三个月开始,每个月兔子的对数是前连个月的兔子对数和。这样就好办了。  我们用先用队列的方式来实现一下:  创建一个数组,记录前两个月兔子,同时可以用数组的push()、shift()方法来模拟队列的一些特性,记住,吃多了拉就是队列,吃多了吐就是栈。


  

  function fibonacci (len) {

            //首先创建一个fibonacci数组,记录兔子的对数,因为前两个月兔子的对数是确定,所以我们要设置fibonacci内前两个月值。
             const fibonacci = [1, 1];

              //复制这个数组用于兔子的队列操作
             const arr = Array.from(fibonacci);

            //循环计算出第len个月兔子的总对数
             for(let i = 0; i < len-2; i++) {

               //fibonacci 每次添加前两个月的兔子对数的和
                 fibonacci.push(arr.reduce((sum, value) =>{
                     return sum + value;
                 }, 0));

                //将当前月的兔子总数进入队列,为了计算下个月的兔子总数
                 arr.push(arr.reduce((sum, value) =>{
                     return sum + value;
                 }, 0));

                //当前月的兔子已经计算出来了,所以我们不再需要知道上上个月的兔子对数了,所以把它踢出队列
                 arr.shift();
             }

           //fibonacci数组中保存的是每个月兔子的对数,只要返回len-1个月就可以了
             return fibonacci[len-1];
         }    

然后我们再用用另一种方法来实现,就通过变量循环赋值来计算就可以,这个比较简单。

function fibonacci_2 (len) {
            let a = 1, // 上上个月
                b = 1, //上一个月
                c = null,  //当前月
                arr = [1, 1];

                for(var i = 0; i< len-2; i++) {
                    c = a+b;
                    arr.push(c);
                    a = b;
                    b = c;
                }
            return arr[len-1];
      }

还有一种就是比较常见的递归方法:

const firbonacci = (function() {

          //创建一个数组,保存前两个月的兔子
          const arr = [0, 1];
            return function fn (n){

                      if(n < 0) return ;
                        
//如果是前两个月,直接返回数组对应的项 if(n < 2) return arr[n]; if(arr[n]) return arr[n];
        //递归执行函数 return fn(n-1) + fn(n-2); } }());

  实现斐波那契数列还有很多的方法,用数据结构来解决问题我觉得是很有意思的事情,以上的实现方式不考虑时间复杂度、空间复杂度什么的,哥写代码就一句话:撸起袖子,操起键盘,一顿Ctrl+c 和Ctrl+v,就是干!

javascript 实现斐波那契数列的不同姿势的更多相关文章

  1. js算法集合(二) javascript实现斐波那契数列 (兔子数列)

    js算法集合(二)  斐波那契数列 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列进行研究,来加深对循环的理解.     Javascript实 ...

  2. JavaScript实现斐波那契数列

    什么是斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为&qu ...

  3. JavaScript生成斐波那契数列

    常规写法 https://cn.bing.com/search?q=js+fibonacci+sequence&pc=MOZI&form=MOZSBR //Fibonacci func ...

  4. 斐波拉契数列(用JavaScript和Python实现)

    1.用JavaScript 判断斐波拉契数列第n个数是多少 //需求:封装一个函数,求斐波那契数列的第n项 //斐波拉契数列 var n=parseInt(prompt("输入你想知道的斐波 ...

  5. Javascript数组求和的方法总结 以及由斐波那契数列得到的启发

    一次面试中,面试官要求用三种不同的Javascript方法进行一个数字数组的求和,当时思来想去只想到了使用循环这一种笨方法,因此面试比较失败,在这里总结了六种Javascript进行数组求和的方法,以 ...

  6. javascript:算法之斐波那契数列

    一 //1,1,2,3,5,8,13,21这个数列 斐波那契 数列(肥波哪弃) //得到第9项是几? /*******************************111111111递归的思想*** ...

  7. javascript . 03 函数定义、函数参数(形参、实参)、函数的返回值、冒泡函数、函数的加载、局部变量与全局变量、隐式全局变量、JS预解析、是否是质数、斐波那契数列

    1.1 知识点 函数:就是可以重复执行的代码块 2.  组成:参数,功能,返回值 为什么要用函数,因为一部分代码使用次数会很多,所以封装起来, 需要的时候调用 函数不调用,自己不会执行 同名函数会覆盖 ...

  8. 《剑指offer》— JavaScript(7)斐波那契数列

    斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 实现代码 function Fibonacci(n) { var arr = ...

  9. JavaScript 实现:输出斐波那契数列

    问渠那得清如许,为有源头活水来. 想要保持自己的技术活力,最有效的手段就是通过不断地输入来提供足够的养分.我们也不必刻意追求高深的或者新鲜的知识点,通过对一个基础问题的全方位多维度解析,同样也会收获不 ...

随机推荐

  1. poj_2195Going Home(最小费用最大流)

    poj_2195Going Home(最小费用最大流) 标签: 最小费用最大流 题目链接 题意: 有n*m的矩阵,H表示这个点是一个房子,m表示这个点是一个人,现在每一个人需要走入一个房间,已经知道的 ...

  2. 打开redis和solr

  3. struts中用kindeditor实现的图片上传并且显示在页面上

    做公司网站的时候由于需要在内容属性中加入图片,所以就有了这个问题,本来一开始找几篇文章看都是讲修改kindeditor/jsp/file_manager_json.jsp和upload_json.js ...

  4. sizeof与strlen的不同

    sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. sizeof是算符,strlen是函数. si ...

  5. Python scrapy------分类获取美团整站数据

    欢迎联系讨论:qq:1170370113 以下是我们获取美团页面的城市信息 获取到了城市信息以后我们可以进行分类保存,以便于后续能够分类获取数据 获取我们需要城市的景区的所有相关id并且进行保存 最后 ...

  6. 从零开始学习前端JAVASCRIPT — 5、JavaScript基础BOM

    1:BOM(Browser  Object  Model)概念 window对象是BOM中所有对象的核心. 2:window属性(较少用) self:self代表自己,相当于window. windo ...

  7. thinkphp无法加载控制器:Admin

    在使用thinkphp时,通过某入口文件访问其他非默认的模块(比如Admin模块),出现报错: 无法加载控制器:Admin 原因:入口文件(比如index.php)中定义了绑定某个具体的模块 如:de ...

  8. asp.net -mvc框架复习(10)-基于三层架构与MVC搭建项目框架

    一.三种模式比较 1.MVC框架(适合大型项目) (1).V视图 (网页部分) (2).M模型 (业务逻辑+数据访问+实体类) (3).C控制器 (介于M和V之间,起到引导作用) 2.三层架构 (1) ...

  9. NSString拼接字符串

    NSString* string; // 结果字符串 02 NSString* string1, string2; //已存在的字符串,需要将string1和string2连接起来 03   04 / ...

  10. LINUX文档管理命令

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...