- 古典问题:第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(意味着生长期为2)
这里我采用两种结题思路 - 第一种不考虑递归,采用字面解释进行基于类对象的做法
class Rabbit {
public int month; //代表成长了几个月
public boolean bltn; //代表是否新生
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public boolean isBltn() {
return bltn;
}
public void setBltn(boolean bltn) {
this.bltn = bltn;
}
public Rabbit(int month,boolean bltn,String name) {
super();
this.bltn = bltn;
this.month = month;
this.name = name;
}
public Rabbit() {
super();
}
@Override
public String toString() {
return "Rabbit [month=" + month + ", bltn=" + bltn + ", name=" + name + "]";
}
}
public static Integer getNumRabbit(Integer month) {
// 1、设置CurrentList兔子的数量
List<Rabbit> rabbitList = new ArrayList<Rabbit>();
rabbitList.add(new Rabbit(1,true,"一代"));//设置第一代兔子,初始月为1
//if(month==1||month==2) { //加不加都行
// return rabbitList.size();
//}
for (int i = 2; i <= month; i++) { //从2月份开始
List<Rabbit> incrList = new ArrayList<Rabbit>();
Iterator<Rabbit> iterator = rabbitList.iterator();
while(iterator.hasNext()){
Rabbit ra = iterator.next();
if (ra.month%2==0&&ra.bltn) { //判断是不是可以变成成熟期
ra.bltn = false;
}
if(!ra.bltn) {//成熟一直生产
incrList.add(new Rabbit(1,true,ra.getName()+"i"));
}
ra.month ++ ;
}
rabbitList.addAll(incrList);
System.out.println(rabbitList.toString());
}
return rabbitList.size();
}
- 第二种采用递归的方式,首先找到规律
//一月 二月 三月 四月 五月 六月 七月
//1 1 2 3 5 8 13
//则有f(x)=f(x-1)+f(x-2)
- 为什么采用递归方式,你可以试试比较这两种方法处理2*12个月的数据,果然递归的效率杠杠的