/**
* 有一对兔子,从出生后第3个月起每个月都生一对兔子,
* 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
*
* 规律分析: 1,1,2,3,5,8,13,21,34...
*/
说起这个问题,可能第一反应大多都是递归解决.其实,这个问题同样也可以用面向对象的思想来解决.好啦话不多说上代码.
首先,把兔子作为一个实体类封装起来,它具有年龄属性以及成长,繁殖的行为.
/**
* 兔子
*/
public class Rabbit {
/**
* 年龄
*/
private int age;
/**
* 成长
*/
public void grow() {
++age;
}
/**
* 繁殖
*/
public Rabbit breed() {
//每只兔子最少两岁才具有繁殖能力
if (age >= 2) {
return new Rabbit();
}
return null;
}
}
具体实现:
public class Test {
public static void main(String[] args) {
int month = 12;
int count = oop(month);
System.out.println("第" + month + "个月的兔子总数是" + count + "只");
}
private static int oop(int month) {
List<Rabbit> family = new ArrayList<>(); //兔子家族
family.add(new Rabbit()); //第一位家族成员诞生,它是兔子鼻祖
for (int i = 1; i < month; i++){ //每循环一次,代表过一个月
for (Rabbit r : new ArrayList<Rabbit>(family)) { //所有家族成员年龄增加,并开始繁殖
r.grow();
Rabbit baby = r.breed();
if (baby != null) {
family.add(baby); //新的baby也会加入家族中
}
}
}
return family.size(); //最终,返回家族中的成员数量
}
}
运行结果:
第12个月的兔子总数是144只
怎么样,通过这个小小demo有没有让你感受到OOP思想的强大之处呢?
也顺便附上递归代码:
public class Test {
public static void main(String[] args) {
int month = 12;
int count = recursion(month);
System.out.println("第" + month + "个月的兔子总数是" + count + "只");
}
private static int recursion(int month) {
if (month == 1 || month == 2) {
return 1;
} else {
return recursion(month - 1) + recursion(month - 2);
}
}
}