方法一:面向对象
public class Cow {
/*
* 一个农夫,买了一头小牛,这头小牛成长到第四年开始,会每年生一头小牛,
* 所出生的小牛成长到第四年开始,也会每年生一头小牛,请问N年后,农夫共有多少头牛
*
*/
private int age;
public Cow() {
// TODO Auto-generated constructor stub
age = 1;
}
//增加年龄
public void addAge() {
age ++;
}
//是否可以生产小牛
public boolean isCanBirth() {
return age >=4;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int N=11;
List<Cow> list = new ArrayList<Cow>();
list.add(new Cow());
for (int i = 1; i <= N; i++) {
for (int j = 0; j < list.size(); j++) {
Cow cow =list.get(j);
if(cow.isCanBirth()){
list.add(new Cow());
}
cow.addAge();
}
System.out.println("第"+i+"年,牛的数量" + list.size());
}
System.out.println(N + "年后,牛的数量:"+ list.size());
}
}
第1年,牛的数量1
第2年,牛的数量1
第3年,牛的数量1
第4年,牛的数量2
第5年,牛的数量3
第6年,牛的数量4
第7年,牛的数量6
第8年,牛的数量9
第9年,牛的数量13
第10年,牛的数量19
第11年,牛的数量28
11年后,牛的数量:28
方法二:递归
public static void main(String[] args) {
// TODO Auto-generated method stub
int N=11;
long num =new Cow().fun(N);
System.out.println(N + "年后,牛的数量:"+num);
}
public long fun(int n) {
long num=0;
if(n==1 || n==2 || n==3){
num=1;
}else{
num = fun(n-3)+fun(n-1);//今年小牛总数量=今年新生的小牛+去年小牛的数量
}
return num;
}
方法三:递归
private static int sum =1;
public static void main(String[] args) {
// TODO Auto-generated method stub
int N=11;
new Cow().fun(N);
System.out.println(N + "年后,牛的数量:"+sum);
}
public void fun(int n){
int y = n-3;//父代可生的子代数量
if(y>0){
sum = sum +y;
for(int i=0;i<(y-1);i++){//子代可生子代的数量
fun(n-(3+i));
}
}
}