本文属贫僧不吃肉原创,欢迎转载,转载请注明来自 http://never-say-never.iteye.com/blog/851512
今天看马士兵老师的视频,看见了一道有意思的笔试题,农场与母牛
题目是这样的:
农场一头小母牛,
母牛五岁产母牛,
每年生头小母牛,
二十年有多少牛。
感兴趣的同学请在此思考20秒。。。。
看到此题,我的第一反应就是递归啊、函数什么的。接着老师说了一句:“请不要先把思维陷入到算法里,先用面向对象的思维来考虑……”。 这时,我才突然反应过来,我的面向过程思维根深蒂固,面向对象思维还需加强呐!同时,由于换了个思维,所以这道题也勾起了我的兴趣,于是着手实现起来…
//母牛类 public class Cow { private int age; //有一个属性,年龄 public Cow(){ this.age=0; //构造函数,默认生下来的小崽为0岁 } public void grow(){ this.age++; //长一岁 } public int getAge(){ return age; //返回牛的年龄 } //生崽 public void lay(Farm f){ f.addCow(); } }
接着抽象农场类
import java.util.Vector;
public class Farm {
private Vector<Cow> cows; //农场的牛群,用vector盛放,
private int count=0; //农场的总牛数
public Farm(){
cows=new Vector(); //若不new Vector直接赋值为null的话会引发空指针异常
}
//得到总牛数
public int getCount() {
count=cows.size();
return count;
}
//增加一头牛
public void addCow(){
this.cows.addElement(new Cow());
}
//农场进入下一年,满了5岁的牛就产崽并长一岁,没满的就只长一岁
public void nextYear(){
int before=cows.size();
for(int i=0;i<before;i++){
Cow c=(Cow)cows.elementAt(i);
if(c.getAge()>=5){
c.grow();
c.lay(this);
}
else{
c.grow();
}
}
}
//为了显示方便,我就直接把main写在Farm类里面了
public static void main(String [] args){
Farm farm=new Farm();
farm.addCow();
for(int i=1;i<=20;i++){
farm.nextYear();
System.out.println("第 "+i+"年有牛 :"+farm.getCount());
}
}
}
第 1年有牛 :1 第 2年有牛 :1 第 3年有牛 :1 第 4年有牛 :1 第 5年有牛 :1 第 6年有牛 :2 第 7年有牛 :3 第 8年有牛 :4 第 9年有牛 :5 第 10年有牛 :6 第 11年有牛 :7 第 12年有牛 :9 第 13年有牛 :12 第 14年有牛 :16 第 15年有牛 :21 第 16年有牛 :27 第 17年有牛 :34 第 18年有牛 :43 第 19年有牛 :55 第 20年有牛 :71
在纸上推了一下,貌似是对的。
题目不难,但是有一些细节如果没注意的话,还是会很恼人,牛是在第5岁的时候产下崽还是第6岁的时候把崽产下来,比如刚生下来的崽是0岁而不是1岁,对象的引用,等。
所以,虽然简单,也还是花了我一些时间的~
再送个好玩的段子~
女孩问男孩: "abcdefg是什么意思呀"?
男孩想了一会说:“A boy can do everything for girl"。
最后,附上代码供大家交流~~