最近接触到一个有趣的兔子问题(斐波那契数),在网上看了看基本都是一些C语言的解决方案,涉及到一些高深的算法,所以就想用面向对象的思想来解决一下这个问题.
先附上问题:有人想知道一年内一对兔子可繁殖成多少对,便筑了一道围墙把一对兔子关在里面。已知一对兔子每一个月可以生一对小兔子,而一对兔子出生后.第三个月开始生小兔子假如一年内没有发生死亡,则一对兔子一年内能繁殖成多少对?(来自百度百科)
分析这个问题,首先抽象出兔子模型(以一对作为单位)
package yao.com.rabit;
public class ParRabbit {
public int month=1;// 出生后的第几月
public ParRabbit getRabbit() //生育小兔子的功能
{
return new ParRabbit();
}
public void growup() //长大的功能(按月计算)
{
this.month++;
}
}
分析和建立好兔子模型后,完成功能
package yao.com.rabbit;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<ParRabbit> list =new ArrayList<ParRabbit>();//定义一个养殖场用于存放所有的兔子
ParRabbit rabit =new ParRabbit(); //买回第一对兔子
list.add(rabbit); // 放入养殖场精心饲养
for(int i=0;i<12;i++) //在一年内(12个月)
{
List<ParRabbit> list0 =new ArrayList<ParRabbit>(); //每个月开始准备一个新的待产房
for(ParRabbit pr:list) //查看养殖场内所有待产的兔子,
{
if(pr.month>=3) //出生后三个月为预产期
{
list0.add(pr.getRabbit()); //到达预产期的兔子在产房出生
}
}
list.addAll(list0); //新生的兔子开始进入养殖场
for(ParRabbit pr:list)//每对兔子都在长大一个月
{
pr.growup();
}
System.out.println("第"+(i+1)+"月的兔子数------>"+list.size()); //月底清点兔子总数
}
}
}
第1月的兔子数------>1
第2月的兔子数------>1
第3月的兔子数------>2
第4月的兔子数------>3
第5月的兔子数------>5
第6月的兔子数------>8
第7月的兔子数------>13
第8月的兔子数------>21
第9月的兔子数------>34
第10月的兔子数------>55
第11月的兔子数------>89
第12月的兔子数------>144
总结:虽然代码感觉多了,但是整个实现过程并没有太过于复杂的算法实现,基本都是根据现实中的情景构建!这里之所以要将出生的兔子转移到产房是因为
直接存放在list中是不允许的,(站在桥上拆桥的情况),及在遍历list的时候又往里面添加元素是不行的!!!
-------------java菜鸟,诸多不足,还望同行多多指正,和交流!!!