一、问题描述
一头母羊的寿命是5年,它会在第2年底和第4年底各生下一头母羊,第5年底死去,问一开始农场有1头母羊,请编写第N年底,农场会有多少只母羊?
二、解决方案
1. 面向对象
创建母羊对象sheep,属性为母羊的年龄age,第N年底出生为0岁,setAge(0),来年为1岁,当年龄等于2或者4时生小羊,年龄为5时死亡。
用List保存所有存活的母羊,有小羊出生时add,母羊死亡是remove。
2. 递归
方法一
方法二
三、代码
public class SheepTest {
public static void main(String[] args) {
List<Sheep> list = new ArrayList<>();
Sheep sheep = new Sheep(0);
list.add(sheep);
int year = 10;
for (int i = 1; i <= year; i++) {
for (int j = 0; j < list.size(); j++) {
Sheep temp = list.get(j);
temp.setAge(temp.getAge()+1);
if (temp.getAge() == 2 || temp.getAge() == 4) {
Sheep s = new Sheep(-1);
list.add(s);
} else if (temp.getAge() == 5) {
list.remove(temp);
j--;
}
}
System.out.println("第"+i+"年,"+list.size()+"只:"+list.toString());
}
System.out.println(num(year));
System.out.println(totalAfterYear(year));
}
public static int num(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
if (n == 2 || n == 3) return 2;
if (n == 4) return 4;
return (n >= 5 ? 0 : 1) + num(n - 4) + num(n - 2);
// num(N-4)就是求取经过一年的子孙,num(N-2)就是求取救过3年的索引子孙
}
static int count = 1;
static int totalAfterYear(int year) {
for (int i = 0; i <= year; i++) {
if (i == 2 || i == 4) {
count++;
totalAfterYear(year - i);
}
if (i == 5) {
count--;
break;
}
}
return count;
}
}
class Sheep {
private int age;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
Sheep() {
}
Sheep(int age) {
this.age = age;
}
@Override
public String toString() {
return "{" +
"age=" + age +
'}';
}
}