http://blog.csdn.net/zhong317/archive/2009/11/02/4757827.aspx
问题大概:
假设有一种牛,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.回溯算法实现:
-
-
-
- public static int generateCow(int adult){
-
- int child = 0;
-
- 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;
-
-
- 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.面向对象的解法:
(1)牛的类
- 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(){
-
-
- Vector cows = new Vector();
-
- Cow firstCow = new Cow();
-
- cows.add(firstCow);
-
- for(int i=1;i<=YEARS;i++){
- int cowSize = cows.size();
- for(int j=0;j
- Cow cow = (Cow)cows.elementAt(j);
- cow.Grow();
- if(cow.it_can_be_a_Mother()){
- cows.add(cow.generateChild());
- }
-
- }
-
-
- }
- return cows.size();
-
-
- }
阅读(853) | 评论(0) | 转发(0) |