问题

有人想知道一年内一对兔子可繁殖成多少对,便筑了一道围墙把一对兔子关在里面。已知一对兔子每一个月可以生一对小兔子,但是一对兔子要从出生后第三个月才开始生小兔子假如一年内没有发生死亡,则一对兔子一年能繁殖成多少对?

代码

 function f(n){    // 先用一个数组,保存第一个月和第二个月兔子数量var Fibonacci = [1,1];for(var i=2;i<n;i++){Fibonacci[i] = Fibonacci[i-1] + Fibonacci[i-2]}return Fibonacci[n-1];}f(12);

运行结果

 f(12)   // 144

一年后,共有144对兔子

分析

解决这种问题,我们一定要找到其中的规律,看下图

从图中我们能看到的规律:
从第三个月开始,第n个月兔子的总对数=第(n-1)月兔子的总对数+第(n-2)月兔子的总对数,也就是前面相邻两项之和,构成了后一项。

仔细思考这个规律,我们来写代码,这个规律其实就是在不断的把前两项相加,得到后一项,不断的重复这个事情,想到这我们应该会想到用循环来写,第一个月和第二个月比较特殊,我们用数组先保存下,然后就简单了,不断的把前两个月的数量相加,然后保存就好了。

代码

 function f(n){    // 先用一个数组,保存第一个月和第二个月兔子数量var Fibonacci = [1,1];console.log(`第1个月,共有${Fibonacci[0]}对兔子`);console.log(`第2个月,共有${Fibonacci[1]}对兔子`);for(var i=2;i<n;i++){Fibonacci[i] = Fibonacci[i-1] + Fibonacci[i-2];console.log(`第${(i+1)}个月,共有${Fibonacci[i]}对兔子`);}return Fibonacci[n-1];}f(12);

运行结果

总结

现在问题算是解决了,我们再来看一种代码量更少的实现方法

function f(n){if(n == 1 || n == 2){return 1;}return f(n-1)+f(n-2);};console.log(`共有${f(12)}对兔子`);

这种方法就是利用了递归。
递归是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。
递归指的是一个过程:函数不断引用自身,直到引用的对象已知。

说的简单点,递归就是在一个函数内,又调用了自己,但是递归调用的内层函数,是在外层函数还未结束时就已经开始了,外层函数的调用,就会被阻塞,所以缺点就是,算法复杂度太高,而且太浪费内存。

比如说我们算 f(12) 那么我们会计算 f(11) 和 f(10) ,而计算 f(11) 时,又要计算 f(10),这就很浪费了。
所以这个递归需要优化下,看下面的代码。

function f(n , ac1 = 1 , ac2 = 1) {if( n == 1 || n ==2 ) {return ac2};return f(n - 1, ac2, ac1 + ac2);
}
console.log(`共有${f(12)}对兔子`);

这段代码是通过 尾递归 优化后的样子。

递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。

至于尾递归具体是怎么回事,阮一峰老师已经说得非常好了,想了解的朋友可以看看那这里

而斐波那契数列,就是我们得到的那段数字 1,1,2,3,5,8,13,21,34,55,89,144,至于更加详细的可以自己查查看!

JavaScript初级玩法(3)—兔子问题(斐波那契数列)相关推荐

  1. 有趣的兔子(斐波那契数列)

    有趣的兔子(斐波那契数列) 如果每对兔子每月繁殖一对子兔,而子兔在出生后第二个月就有生殖能力,试问一对兔子一年能繁殖多少对兔子?可以这样思考:第一个月后即第二个月时,1对兔子变成了两对兔子,其中一对是 ...

  2. Java编程练习之:有关兔子的斐波那契数列问题解析

    文章目录 1. 题目 2. 思路 3. 代码 4. 运行结果 1. 题目 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的 ...

  3. 古老递归问题(兔子版本斐波那契数列)

    题目: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 首先,我目前还是菜鸟,若解答有问题,直接评论戳我吧! 这是 ...

  4. 兔子生兔子问题(斐波那契数列)

    问题描述: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少 分析: 这道题我们可以把兔子分为三个阶段,幼崽.成年,生 ...

  5. 兔子问题(斐波那契数列)

    有这样一个有趣的"兔子问题":"假定一对大兔子每月能生一对小兔子,且每对新生的小兔子经过一个月可以长成一对大兔子,具备繁殖能力,如果不发生死亡,且每次均生下一雌一雄,问一 ...

  6. 递归优化为递推:数组/临时变量-计算兔子(斐波那契数列)

    题目 有一对兔子,从出生后第3个月起每个月都生一对兔子,一对小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第n个月(n<=50)的兔子总数为多少对? 题解 多次递归 /* 找规律: ...

  7. 兔子c语言程序,可爱的C语言程序。....兔子问题...斐波那契数列

    输入月数(少于40): 40 M.1:         1M.2:         1M. 3:         2 M. 4:         3M. 5:         5M. 6:       ...

  8. 斐波那契数列---兔子繁殖题

    斐波那契数列-兔子繁殖题 如果说兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来.假设所有兔子都不会死去,能够一直干下去,那么一年以后可决繁殖多少对兔子呢? 斐波那契数列的迭代实现 ...

  9. 兔子生兔子之递归问题(递归实现斐波那契数列)

    今天给大家带来一个经典题,斐波那契数列,题目如下: //题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,//小兔子长到第三个月后每个月又生一对兔子.假如兔子都不死,要求根据输入的月份输出对应兔 ...

  10. 【趣学算法】神奇的兔子序列(斐波那契数列)

    14天阅读挑战赛 努力是为了不平庸~ 算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算 ...

最新文章

  1. csv 逗号数量不一样_敲黑板,表格后缀xls、xlsx、xlsb、xlsm、csv分别是什么意思?...
  2. 丁丁打折网卷能用吗_跳槽频繁的人能用吗?
  3. nginx ------反向代理和负载均衡
  4. Matlab-OpenCV-VC-混合编程配置
  5. CRM Excel导出技术实现的调试截图
  6. 计算机编程英语怎么写,计算机编程英语词汇大全.pdf
  7. MongoDB3.4为单独的数据库创建用户
  8. hibernate中的saveOrUpdate()报错
  9. 后缀表达式转中缀表达式(非常简单易懂)
  10. convertio文件转换器
  11. jpg怎么合成一份_如何将多张图片合成一个文件
  12. imagej对像素进行操作
  13. 非线性优化汇总——Matlab优化工具箱(持续更新中)
  14. 往事不回头,今后不将就~~Fighting
  15. Java代码小demon(一)SpringBoot+二维码和条形码生成
  16. 计算机辅助教学原理感悟,计算机辅助教学课程学习心得.docx
  17. 【引语练习题】Ask questions politely
  18. 广东移动魔百盒M411A _905L3_线刷固件包
  19. 爬虫基础(5) -网页解析
  20. Google Adwords新手快速入门教程

热门文章

  1. 15分钟破解网站验证码
  2. 程序员的 100款代码表白特效,一个比一个浪漫
  3. 十四、关于利用卡诺图快速解决时序电路自启动问题的研究
  4. 确定你到底喜欢什么事
  5. 吉林大学软件学院期末题答案(10-16级)
  6. 麒麟OS 强制设置短密码
  7. 由乌龟画一个正方形所想到的
  8. 3D打印服务器Octoprint配置步骤
  9. 「津津乐道播客」#212. 乱炖:原地爆炸的ZOOM做错了什么?
  10. five86-3靶机渗透攻略