基础算法-生兔子(JAVA)
算法题目描述
有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子倡导第三个月后每个月又生一对兔子,假如兔子都不死,问第n(n为正整数)个月的兔子对数为多少?
算法分析
第一个月1对兔子,第二月一对兔子。
第三个月:第二个月的兔子个数再加上新生兔子个数。
新生兔子个数:依据题目:从新生兔子第三个月起才会生兔子,所以第一个月的一对兔子要在第三个月生下一对新兔子;
所以,第三个月总新生兔子数为1;
那么,第三个月总兔子数为第二个月兔子数(1)加上第三个月新生兔子数(即第一个月兔子个数,为1) = 2;
得到规律:新生兔子从第三个月起开始生兔子,且当前月所生兔子数为前第二个月兔子总数。以此类推:从第三个月起每个月兔子个数=前一个月兔子总数 + 前第二个月兔子总数(代表了将要出生的兔子个数)。
公式:
n<=2: 兔子总数=1
n>2: 兔子总数=(n-1)月兔子总数+(n-2)月兔子总数
使用循环解决问题
直接看算法:
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);//接受输入int n = scanner.nextInt();//获取月数int[] array = new int[n];//定义数组存储//第一个月和第二个月int i1 = 1;int i2 = 1;array[0] = i1;array[1] = i2;//从第三个月开始for (int i = 3;i <= 10; i++){//数组下标要减1array[i - 1] = array[i - 2] + array[i - 3];//当前月兔子数=上一个月兔子数 + 前第二个月兔子数}System.out.println(array[array.length - 1]);//打印输出当前总兔子数:即为最后一个月的兔子数}
使用反向递归解决问题
由上面的分析我们知道了这个公式:
公式:
n<=2: 兔子总数=1
n>2: 兔子总数=(n-1)月兔子总数+(n-2)月兔子总数
那么基于这个公式我们知道当前月份的兔子总数=往前倒两个月份兔子总数之和,那么当给定一个月份数字,我们可以循环嵌套使用这个公式:
比如:
当月份为4时,那么可以转换为
4月兔子总数=3月兔子总数 + 2月兔子总数
其中三月兔子总数又可以转换为
3月兔子总数=2月兔子总数+1月兔子总数
总式子就变为
4月兔子总数=(2月兔子总数 + 1月兔子总数) + 2月兔子总数。
整体的计算结构我们可以归纳程一个树形结构,如下图:
我们从根节点往下不断进行迭代,每一个当前节点都等于下两个子节点的和,最后把这些加在一起就是最后的结果。
算法:
public class Main {public static void main(String[] args) {int n = 10;System.out.println(func(n));}/*** 递归算法*/private static int func(int n){//第一个月和第二个月特殊处理if (n == 1 || n == 2){System.out.println(1);return 1;}else {//三个月以上开始递归计算
// System.out.println("第"+n);return func(n-1)+func(n-2);}}
}
总结
很多时候正向的计算往往带不来太大收益,这时候就可以考虑放过来,逆向运算。
基础算法-生兔子(JAVA)相关推荐
- 一只兔子每三个月生兔子JAVA,兔子生兔子问题
关于兔子生兔子的算法详解 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔 子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析: 第1个月 -- 1对 第2 ...
- Java基础算法题(01):判断101-200之间有多少个素数,并输出所有素数。 素数又叫质数,就是除了1和它本身之外,再也没有整数能被它整除的数。也就是素数只有两个因子。
查看所有50道基础算法题请看: Java的50道基础算法题 import java.util.ArrayList; import java.util.List; public class Detect ...
- Java基础算法题(02):古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
查看所有50道基础算法题请看: Java的50道基础算法题 递归的方法 package Demo02Rabbits; import java.util.Scanner; public class Ra ...
- java基础编程练习题--兔子生兔子问题
java基础编程练习题--兔子生兔子问题 题目要求 题目分析 java代码示例 输出结果 题目要求 现有一对兔子,每一对兔子每个月都会生一对小兔子,小兔子在月龄达到第三个月开始每个月就可以生一对,兔子 ...
- php狼和兔子算法,PHP基于递归算法解决兔子生兔子问题php技巧
这篇文章主要介绍了PHP基于递归算法解决兔子生兔子问题,结合实例形式分析了兔子生兔子问题的php面试题采用循环与递归两种思路的解决方法,需要的朋友可以参考下 本文实例讲述了PHP基于递归算法解决兔子生 ...
- Java的知识点18——数组存储表格数据、冒泡排序的基础算法、冒泡排序的优化算法、二分法查找
数组存储表格数据 package cn.dym08; import java.util.Arrays; public class Test09 {public static void main(Str ...
- Java中对查出的数据计数_基础算法7:从数据库某个字段中取出现次数最多的几条数据形成“热门xxx”...
在这里,我们需要查出所有的"出发城市"和"到达城市",并对每个城市进行计数根据其出现次数来取出几个出现次数最多的城市为热门城市 注:将多个字段的数据合并在一起并 ...
- java基础算法题(入门题与简单题)
题目来自lintcode,答案来自九章算术,将自己在lintcode上训练的一些简单算法题贴出来,作为知识的总结与整理.便于查看复习. 第一部分(入门级别,只做了开放的部分,大部分需要收费的VIP才有 ...
- python兔子编程_Python兔子生兔子算法,编程练习题实例十一
Python兔子生兔子算法,编程练习题实例十一 Python兔子生兔子算法,编程练习题实例十一 没学习python之前就听说过一个兔子生兔子的数学算法问题.现在学习了python编程后,自然要用pyt ...
最新文章
- uva 1416 (SPFA) **月赛第E题的原题**
- 2006年猪的述职报告
- 爆牙齿的新发现:先clear:left才能正常position:absolute。
- 选择器Selector
- 初识Mysql(part18)--我需要知道的4个关于联结的小知识点
- [one day one question] GIF动画为什么只动一次不能循环
- python利用pygame框架实现类似推箱子游戏 Star Pusher
- 【CNN】 吴恩达课程中几种网络的比较
- 又一款性能调优神器,真香!
- 简单的JSON解析工具
- exchange 2010部署之一
- 改手机为自动开机的车载导航仪
- python int转换为byte_Python int与byte类型相互转化
- Pandas 学习笔记二
- TMS570-6-HET PWM
- excel worksheet
- /,./和../的区别
- 《风之旅人》游戏设计思想二
- 阿里云数据库MongoDB版助力吉比特《一念逍遥》游戏斩获千万玩家,运营效率成倍增长
- 最实用的简历模板之一:QQ邮箱免费简历模板