关于兔子生兔子的算法详解

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔

子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

分析:

第1个月  --  1对

第2个月  --  1对

第3个月 -- 原来的1对 +  新生1对  =  2对

第4个月 --前面存在的3对(即第3个月的数量) +  往后2个月的兔子对生的兔子 1对(即4  - 2  = 2月的兔子对生的兔子对 1对) = 2 + 1 =  3对

第5个月  --第4个月的兔子对数量 (3对) +  第3个月兔子对所生的兔子对(2对,因为兔子出生2个月后可以生兔子) =  3  +  2  = 5

第6个月 --第5个月的兔子对数量 (5对) +  第4个月兔子对所生的兔子对(3对) = 5 + 3 = 8

以此类推

兔子的规律为数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

所以很明显兔子数量为斐波那契数列,下面只需要用代码计算斐波那契数列即可。

public static int feibo(int num){

if ( (num == 1) || (num == 2)){

return 1 ;

}else{

return feibo(num - 1) + feibo(num - 2) ;

}

}

以下为完整java程序:

public class FeiboTest {

public static void main(String []args){

int num = Integer.valueOf(args[0]) ; //通过命令参数传入月份 java FeiboTest 10

System.out.println(feibo(num)) ;

}

public static int feibo(int num){

if ( (num) == 1 || (num == 2)){

return 1 ;

}else{

return feibo(num - 1) + feibo(num - 2) ;

}

}

}

其实这种重复问题使用递归,会有很大的浪费,比如,计算feibo(8) =feibo(7) + feibo(6)

而feibo(7) 的计算也会用到feibo(6) ,而这个feibo(6) 每次又是通过递归重新计算的。

我们可以先做一个测试:

public static int feibo(int num) {

System.out.println("feibo(" + num + ") 被调用.");

if ((num == 1) || (num == 2)) {

return 1;

} else {

return feibo(num - 1) + feibo(num - 2);

}

}

你调用一下fibo(10),就会发现,好多的函数被重复调用了

所以,我们要想更好的办法避免这些浪费,这就用到了“动态规划”的思想:

private static int ARRS[] = new int[50];定义一个数组(这里为了说明问题,考虑50个月以内的)

这样,第一次调用后,把这个值存在数组中,(feibo(i)的值保存在a[i-1]中)

这样下一次,在使用这个值的时候就可以直接调用而不是递归了。

新的动态规划版斐波那契函数:

public class FeiboTest {

private static int ARRS[] = new int[50] ;

static {

for (int i = 0; i< 100; i++){

ARRS[i] = 0 ;

}

}

public static void main(String[] args) {

int num = Integer.valueOf(args[0]);

System.out.println(feibo(num));

for (int i = 0; i < 100; i++) {

if (ARRS[i] == 0) {

break ;

}

System.out.println("+++++++ " + ARRS[i]);

}

}

public static int feibo(int num) {

if (ARRS[num-1] != 0){

return ARRS[num -1] ;

}else{

if ((num == 1) || (num == 2)) {

ARRS[num -1] = 1;

return 1;

} else {

ARRS[num -1] = feibo(num - 1) + feibo(num - 2);

return ARRS[num -1] ;

}

}

}

}

一只兔子每三个月生兔子JAVA,兔子生兔子问题相关推荐

  1. java 例子一对小兔子,Java解决标题:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子。...

    Java解决题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子... 题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生 ...

  2. java题兔子第三个月生_JAVA编程之古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子...

    问题是这样的:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子, 假如兔子都不死,问每个月的兔子总数为多少? 这个问题相信大家已经不在陌生了.很多博 ...

  3. Java基础算法题(02):古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

    查看所有50道基础算法题请看: Java的50道基础算法题 递归的方法 package Demo02Rabbits; import java.util.Scanner; public class Ra ...

  4. Java古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?

    有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 由图可知, 第一个月是小兔子,是一对小兔子 第二个月从小兔子变成大 ...

  5. 兔子繁殖问题:一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的小兔子,问一年中每个月各有多少对兔子(C++)(迭代法)

    算法经典题型13 兔子繁殖问题:一对兔子从出生后第三个月开始,每月生一对小兔子.小兔子到第三个月又开始生下一代小兔子.假若兔子只生不死,一月份抱来一对刚出生的小兔子,问一年中每个月各有多少对兔子.(三 ...

  6. 【Java】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

    需求: 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析: 这是一个斐波那契数列数列问题 同样 ...

  7. java版本,有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?

    题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少? 题目分析:兔子的规律为数列1,1,2,3,5,8,13,2 ...

  8. java题兔子第三个月生_【Java】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每...

    需求: 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析: 这是一个斐波那契数列数列问题 同样 ...

  9. Java算法:每对新生兔子第三个月期起生一对兔子(费氏数列)

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?    程序分析:   兔子的规律为数列1,1,2, ...

最新文章

  1. K-近邻算法之交叉验证,网格搜索
  2. RHTTPHeaders有bug,使用须谨慎
  3. 完美,竟然用一个脚本就把系统升级到https了,且永久免费!
  4. 如何用你最熟悉的 SQL 来查询 Elasticsearch 中的数据?
  5. 最短路径问题-Dijkstra
  6. Xcode 真机沙盒
  7. 【牛客 - 370F】Rinne Loves Edges(树,统计dp)
  8. vs2013 提交 github
  9. 牛顿迭代法解非线性方程组
  10. 数学建模学习笔记(六):排队论模型
  11. DSP重新上电程序不能运行
  12. IT从业者创业公司生存指南:创业后记 ---- 百感交集的过来人
  13. mySQL 2008安装MOF无法连接_安装SQL2008R2时提示:MOF编译器无法连接WMI服务器?
  14. 一些计算机u口无法使用的原因,电脑USB接口突然不能用的多个原因分析
  15. 使用AI提取文字路径
  16. IPD需求和市场管理流程
  17. php 判断来源 微信客户端_使用PHP判断是否为微信、支付宝等移动设备访问代码...
  18. Ax=b有容的极小范数解
  19. python如何群控手机_python调用adb脚本来实现群控安卓手机初探
  20. 给fiash图片加链接

热门文章

  1. 基于微信小程序云开(统计学生信息并导出excel)2.0版
  2. 《学Unity的猫》——第十九集:皮皮猫上班第一天,认识游戏开发公司各个部门
  3. 课程教学c语言遇到的问题,C语言教学中的几点思考
  4. siamfc-pytorch代码讲解(三):demotrack
  5. org.apache.flink.shaded.guava18.com.google.common.util.concurrent.ThreadFactoryBuilder 真实解决方案
  6. 简单使用Search()函数
  7. android edittext怎么输入中文,为什么android中edittext不能输入中文
  8. STM32cubeide代码自动补全教程
  9. DDR中的ODT功能详解及波形对比
  10. 个位数字加百位数字等于千位数字加上十位数字,且该该数为奇数