网上的一道题目整理 《加上了我的注释》很值得看看
一个农夫养了一头牛,三年后,这头牛每年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛……问农夫10年后有多少头牛?n年呢?(用JAVA实现)
草根答案1 :
public class Cow {
private int age; //设置年份
public Cow(){
age = 0; //够着函数 给age赋值
}
public Cow play(){
age ++;
return age > 2 ? new Cow():null; // 如果age 大于 2 ,就生产一个小牛,嘿嘿 我杜撰的名 ,感觉好理解些 ,还有这里如果2改称为 3 就和题目接近了。
}
}
public class Test {
public static void main(String[] args) {
List <Cow> list = new ArrayList <Cow>();
list.add(new Cow()); //开始List里面只有一个牛
for(int i = 0; i < 10;i++){ //年份循环
for(int j =0;j <list.size();j++){ //在具体的那一根年份里面 ,对每一头牛,而言
Cow cow = list.get(j).play(); // 如果大于两年 (正确答案该是三年),每一个存在的牛仔就会生一个小牛
if(cow != null) list.add(cow);
}
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
草根答案2:
public class OxProblem {
public static void main(String[] args) {
for(int i=1;i<=20;i++){
System.out.println("第"+i+"年牛的数量:"+getOxs(i));
}
}
public static int getOxs(int n){
int answer = 0;
if(n>=3){
answer = 1;
for(int i=1;i<=n-2;i++){
answer += getOxs(i);
}
}else{
answer = 1;
}
return answer;
}
}
第1年牛的数量:1
第2年牛的数量:1
第3年牛的数量:2
第4年牛的数量:3
第5年牛的数量:5
第6年牛的数量:8
第7年牛的数量:13
第8年牛的数量:21
第9年牛的数量:34
第10年牛的数量:55
第11年牛的数量:89
第12年牛的数量:144
第13年牛的数量:233
第14年牛的数量:377
第15年牛的数量:610
第16年牛的数量:987
第17年牛的数量:1597
第18年牛的数量:2584
第19年牛的数量:4181
第20年牛的数量:6765
总结 整理
好多人貌似没看清楚题,是三年后,不是第三年,放出两种解题思路,一种是递归,一种是面向对象的思维,第二个很经典,面试的时候能写出第二个这样的代码,会添色不少。
1.递归(结果为28,如果要算n年后的结果,只需将10改为n):
public class Cow {
static int count = 1;
private static void feedCow(int year,int age){
year++;
age++;
if(year<=10){ //递归的调用 当Year 大于十年的时候 不递归了
if(age>=3){ //如果年龄大于三岁的牛就开始生产
count++;
feedCow(year,0);
}
feedCow(year,age);
}
}
public static void main(String[] args) {
new Cow().feedCow(0, 0);
System.out.println(count);
}
}
运行结果:
2:面向对象(很经典的思路,结果当然是28,要求n年后,只需将i <10改为i <n
public class Cow {
public static int count = 0;
public Cow(int year){
count++;
for(int i=3+year;i<=10;i++){
new Cow(i);
}
}
public static void main(String[] args) {
new Cow(0);
System.out.println(count);
}
}
输出的运算结果 :28