-
经典算法题:牛的繁衍问题
if(cow.it_can_be_a_Mother()){ cows.add(cow.generateChild()); } } } return cows.size(); } 测试代码:import java.util.Vector; public class Test { public static final int YEARS = 10; public static void main(String args[]){ //面向对象的解法 System.out.println("牛的总数是:"+ooCow()); //数组解法 System.out.println("牛的总数是:"+funCow()); //回朔解法 System.out.println("牛的总数是:"+generateCow(3)); } public static int ooCow(){.....} public static int funCow(){ ....} public static int generateCow(int adult){ ....} } 总结:据测试,以上三种方法中,数组实现的方法是最高效率的,其空间复杂度为O(1),而时间复杂度为O(N),在效率上,是其他两种方法不可比拟的,其次是回溯法的解法,从逻辑设计上,面向对象的解法是最容易理解的。这道题相信还存在着多种更优秀解题思路,如果从数学角度上进行分析归纳,或许还有效率更优的算法。这是昨天在csdn论坛上看到的一道题,觉得比较有趣,这里把自己的几种做法写出来。问题大概:假设有一种牛,3岁成年,成年后具备自交能力,也就是说不用公牛帮忙,每年可以生产出一只同种类的牛,问如果一个农场有1只该品种0岁的 牛,不考虑牛的寿命问题,那么10年后农场总共 有多少只牛?说明:其实原问题没有这么复杂,但是考虑到一些不必要的争议,所以加了不少题设。从题面上看,头两年第一只牛只能孤独的度过,到了第三年开始,牛会诞下第一个孩子,接下来的每一年都会继续生育,而生下来的孩子三岁成年后也会加入生育大军,孩子的孩子也会陆续具备生育能力。。。推算结果:第1年生育有1只牛 第2年生育有1只牛 第3年生育有2只牛 第4年生育有3只牛 第5年生育有4只牛 第6年生育有6只牛 第7年生育有9只牛 第8年生育有13只牛 第9年生育有19只牛 第10年生育有28只牛 牛的总数是:28 算法:1.回溯算法实现:/** * @param: adult 成年的年份 */ public static int generateCow(int adult){ //孩子总数 int child = 0; //计算从成年开始到第10个年头,每个年头诞生的孩子及其孩子们衍生出来的子孙的总数。 for(int i=adult;i<=YEARS;i++){
child += generateCow(i+3); } //加上本身 return child+1; } 2.利用数组作为辅助结构的解法(三种解法中最高效):public static int funCow(){ //各年龄段未成年牛的总数 int[] nonAge = new int[4]; //牛的总数 int total = 1; //妈妈的数量 int mum = 0; //当前0岁的牛的头数 nonAge[3] = 1; //数组指针,用于实现环形顺序表 int point = 1; for(int i=1;i<=YEARS;i++){
mum+=nonAge[point%4]; total+=mum; nonAge[(point+3)%4] = mum; point++; } return total; } 3.面向对象的解法:class Cow { public int age=0; //年龄//是否能成为妈妈 public boolean it_can_be_a_Mother(){ return age >= 3;}//生育 public Cow generateChild(){ return new Cow(); }//长大一岁 public void Grow(){ age++; }} (2)产牛流程public static int ooCow(){ //牛的集合 Vectorcows = new Vector (); //第一只牛 Cow firstCow = new Cow(); //加入集合 cows.add(firstCow); for(int i=1;i<=YEARS;i++){
int cowSize = cows.size(); for(int j=0;jCow cow = (Cow)cows.elementAt(j); cow.Grow(); 2009/11/3 0:18:09
举报不良信息
转地球陌路狂歌五行缺钱