Chinaunix首页 | 论坛 | 博客
  • 博客访问: 590290
  • 博文数量: 201
  • 博客积分: 3076
  • 博客等级: 中校
  • 技术积分: 2333
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:44
文章分类

全部博文(201)

文章存档

2010年(118)

2009年(83)

我的朋友

分类:

2010-05-12 15:54:54

 http://blog.csdn.net/zhong317/archive/2009/11/02/4757827.aspx


问题大概:

 假设有一种牛,3岁成年,成年后具备自交能力,也就是说不用公牛帮忙,每年可以生产出一只同种类的牛,问如果一个农场有1只该品种0岁的 牛,不考虑牛的寿命问题,那么10年后农场总共 有多少只牛?

说明:

其实原问题没有这么复杂,但是考虑到一些不必要的争议,所以加了不少题设。从题面上看,头两年第一只牛只能孤独的度过,到了第三年开始,牛会诞下第 一个孩子,接下来的每一年都会继续生育,而生下来的孩子三岁成年后也会加入生育大军,孩子的孩子也会陆续具备生育能力。。。

结果:

 

  1. 第1年生育有1只牛  
  2. 第2年生育有1只牛  
  3. 第3年生育有2只牛  
  4. 第4年生育有3只牛  
  5. 第5年生育有4只牛  
  6. 第6年生育有6只牛  
  7. 第7年生育有9只牛  
  8. 第8年生育有13只牛  
  9. 第9年生育有19只 牛  
  10. 第10年生育有28只牛  
  11. 牛的总数是:28  

 算法:

  1.回溯算法实现:

  

  1. /** 
  2.    * @param: adult 成年的年份 
  3.    */  
  4.   public static int  generateCow(int adult){  
  5.      //孩子总数  
  6.      int child = 0;  
  7.      //计算从成年开始到第10个年头,每个年头诞生的孩子及其孩子们衍生出来的子孙的总数。  
  8.      for(int i=adult;i<=YEARS;i++){  
  9.          child += generateCow(i+3);  
  10.           
  11.      }  
  12.      //加上本身  
  13.      return child+1;  
  14.       
  15.       
  16.     }  
  

   2.利用数组作为辅助结构的解法(三种解法中最高效):

 

  1. public static int funCow(){  
  2.        
  3.      //各年龄段未成年牛的总数  
  4.       int[] nonAge = new int[4];  
  5.   
  6.       //牛的总数  
  7.       int total = 1;  
  8.   
  9.       //妈妈的数量  
  10.       int mum = 0;  
  11.   
  12.       //当前0岁的牛的头数  
  13.       nonAge[3] = 1;  
  14.   
  15.       //数组指针,用于实现环形顺序表  
  16.       int point = 1;  
  17.         
  18.       for(int i=1;i<=YEARS;i++){  
  19.           
  20.         mum+=nonAge[point%4];  
  21.         total+=mum;  
  22.         nonAge[(point+3)%4] = mum;  
  23.         point++;  
  24.          
  25.       }  
  26.   
  27.       return total;  
  28.   }  

  3.面向对象的解法:

 

 (1)牛的类

  

  1. class Cow {  
  2.     public int age=0//年龄  
  3.       
  4.     //是否能成为妈妈  
  5.     public boolean it_can_be_a_Mother(){  
  6.         return age >= 3;  
  7.           
  8.     }  
  9.       
  10.     //生育  
  11.     public Cow generateChild(){  
  12.           return new Cow();  
  13.         }  
  14.           
  15.     //长大一岁  
  16.     public void Grow(){  
  17.           age++;      
  18.     }  
  19.       
  20.       
  21. }  
 

  (2)产牛流程

 

  1. public static int ooCow(){  
  2.          
  3.        //牛的集合  
  4.        Vector cows = new Vector();  
  5.        //第一只牛  
  6.        Cow firstCow = new Cow();  
  7.        //加入集合     
  8.        cows.add(firstCow);  
  9.          
  10.        for(int i=1;i<=YEARS;i++){  
  11.         int cowSize = cows.size();  
  12.         for(int j=0;j
  13.           Cow cow = (Cow)cows.elementAt(j);  
  14.           cow.Grow();  
  15.           if(cow.it_can_be_a_Mother()){  
  16.              cows.add(cow.generateChild());  
  17.           }   
  18.                  
  19.         }  
  20.             
  21.               
  22.         }  
  23.         return cows.size();  
  24.           
  25.      
  26.    }  
 

测试代码:

  1. import java.util.Vector;  
  2. public class Test {  
  3.     public static final int YEARS = 10;  
  4.     public static void main(String args[]){  
  5.      //面向对象的解法  
  6.      System.out.println("牛的总数是:"+ooCow());  
  7.      //数组解法  
  8.      System.out.println("牛的总数是:"+funCow());  
  9.      //回朔解法  
  10.      System.out.println("牛的总数是:"+generateCow(3));  
  11.    }  
  12.   
  13. }  

总结:

据测试,以上三种方法中,数组实现的方法是最高效率的,其空间复杂度为O(1),而时间复杂度为O(N),在效率上,是其他两种方法不可比拟的,其 次是回溯法的解法,从逻辑设计上,面向对象的解法是最容易理解的。这道题相信还存在着多种更优秀解题思路,如果从数学角度上进行分析归纳,或许还有效率更 优的算法,有待日后探究,如有更好的思路,望不吝赐教!

 

阅读(823) | 评论(0) | 转发(0) |
0

上一篇:寻找发帖水王

下一篇:mapreduce

给主人留下些什么吧!~~