假设第1个月有1对刚诞生的兔子,第2个月进入成熟期,第3个月开始生育兔子,而1对成熟的兔子每月会生1对兔子,兔子永不死去……那么,由1对初生兔子开始,12个月后会有多少对兔子呢?
兔子数列即斐波那契数列,它的发明者是意大利数学家列昂纳多•斐波那契(Leonardo Fibonacci,1170—1250)。

问题分析

我们不妨拿新出生的1对小兔子分析:
第1个月,小兔子①没有繁殖能力,所以还是1对。
第2个月,小兔子①进入成熟期,仍然是1对。
第3个月,兔子①生了1对小兔子②,于是这个月共有2(1+1=2)对兔子。
第4个月,兔子①又生了1对小兔子③。因此共有3(1+2=3)对兔子。
第5个月,兔子①又生了1对小兔子④,而在第3个月出生的兔子②也生下了1对小兔子⑤。共有5(2+3=5)对兔子。
第6个月,兔子①②③各生下了1对小兔子。新生3对兔子加上原有的5对兔子这个月共有8(3+5=8)对兔子。

可以发现一个有趣的规律,第三个月开始:当月的兔子数=上月兔子数+上上月的兔子数
斐波那契数列如下:
1,1,2,3,5,8,13,21,34,…
递归式表达式:

算法设计

如下所示,用递归实现是不是很简单

public int recursion(int n){if(n  < 1){return -1;}if(n  == 1 || n == 2){return 1;}return recursion(n-1) + recursion(n-2);}

算法验证分析

一般下面三个方面来考算法:

  1. 算法是否正确?
    写个方法来验证他
public static void main(String[] args) {Fib1 fib1 = new Fib1();for (int n = 1; n<10 ; n++){System.out.println(fib1.recursion(n));}
}

执行结果:

毋庸置疑,算法是正确的。

  1. 算法的复杂度如何?
    假设T(n)表示计算Fib1(n)所需要的基本操作次数,那么:
    n=1时,T(n)=1
    n=2时,T(n)=1
    n=3时,T(n)=3;//调用Fib1(2)、Fib1(1)和执行一次加法运算Fib1(2)+Fib1(1)
    因此,n>2时要分别调用Fib1(n−1)、Fib1(n−2)和执行一次加法运算,即:
    n>2时,T(n)=T(n-1)+T(n-2)+1。
    当趋n于正无穷市:

    由于T(n) >= F(n) 所以这是一个指数级算法(时间、空间复杂度都是指数级的)。

  2. 如何改进?
    由于 n >= 3 时 F(n) = F(n-1) + F(n-2),所以可以使用迭代法,每次只需记录单前的值,和上次的值就行。

public int recursion(int n){if(n  < 1){return -1;}if(n  == 1 || n == 2){return 1;}//前两次的值都为1int s1 = 1;int s2 = 1;//m每次迭代记录单前的值,和上次的值。for(int i = 3; i <= n; i++){s2 = s2 + s1; //当前的值s1 = s2 - s1; //上次的值}return s2;}

该算法时间复杂度为 O(n),空间复杂度为O(1) 。

相关应用

  1. 黄金分割数
    随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值 0.6180339887……
  2. 杨辉三角
    力扣 118. 杨辉三角

参考

  1. 《趣学算法》
  2. 斐波那契数列_百度百科

神奇兔子数列:斐波那契数列相关推荐

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

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

  2. c语言斐波那契数列_神奇的数列——斐波那契数列

    斐波那契数列之美 斐波那契是一位数学家,生于公元1170年,籍贯大概是比萨,卒于1240年后.1202年,他撰写了<珠算原理>(Liber Abaci)一书.他是第一个研究了印度和阿拉伯数 ...

  3. 斐波那契数列不用数组_兔子数列——斐波那契数列

    相信人们都对斐波那契数列有或多或少的了解,如果没有,那你一定听过黄金分割比或是见过下面这种图片: 斐波那契生活在十三世纪的意大利,原名列奥纳多·皮萨诺(Leonardo Pisano),他出生在意大利 ...

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

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

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

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

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

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

  7. matlab斐波那契数列画图,斐波拉契数列 斐波那契数列 matlab程序

    斐波那契数列数列从第3项开始,每一项都等于前两项之和. 例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,25 ...

  8. 斐波那契数列编程python_fibonacci数列-斐波那契数列-python编程

    未完待续~ 了解fibonacci数列: 斐波纳契数列(Fibonacci Sequence),又称黄金分割数列. 1,1,2,3,5,8,13,21,34,55,89,144,233,377,610 ...

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

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

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

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

最新文章

  1. 仿余额宝数字跳动效果 TextCounter
  2. Science:睡眠剥夺影响大脑思考竟是因为蛋白质罢工了!
  3. Android蓝牙开发其二
  4. 如何用消息系统避免分布式事务?
  5. IDOC 创建,增强,管理,配置
  6. java数组写入excel_求将java中数组内容逐条加进excel中的代码
  7. systrace html空白,Android性能优化之Systrace工具介绍(一) _ Systrace生成的trace.html打开空白或者打不开的解决办法...
  8. linux下weblogic12c建域,三、WebLogic 12C集群部署-创建域
  9. iis服务器转发消息至服务端,IIS服务器配置NXLog进行syslog转发
  10. 微信公众平台接口测试帐号登录
  11. 为什么有的人飞黄腾达,有的人穷困潦倒 .
  12. 概率论-1.4 条件概率(重点:对P(A | B)、P(AB)、P(B)之间关系的理解)
  13. 2020年微信怎么推刷脸支付
  14. Qt的工程文件(.pro) -- 转
  15. 计算机作业我家乡的变化英语作文,家乡的变化 Changes in My Hometown
  16. Mac上如何下载brew
  17. 百度ai智能写作工具-百度ai自动写文章
  18. SQL中类型转换函数
  19. python的成语接龙程序代码_基于Python经典版成语接龙逻辑实现
  20. matlab memory 代数环,matlab/simulink中代数环的问题及解决措施

热门文章

  1. 视觉系统构建(三)——视觉光源
  2. 2020计算机二级成绩什么时候出来,2020年9月计算机二级成绩大概什么时候出来
  3. 影像组学训练营 第一天(共三天)
  4. 高新技术企业认定代办服务内容及代办多少钱
  5. ORACLE 多表 查询作业
  6. php数字大写,php数字大写转换的方法
  7. 笔记软件,及树形有序笔记的意义
  8. CentOS8主机名设置方式
  9. Win10命令行下可以运行的各种命令
  10. Python: 如何批量预处理FY4A L1 DISK和REGC产品?(辐射定标/裁剪/GLT校正/HDF5转TIFF文件等)