现在的位置: 首页 > 综合 > 正文

奶牛问题

2011年02月21日 ⁄ 综合 ⁄ 共 1419字 ⁄ 字号 评论关闭

在博客园上看到一位园友在讨论奶牛问题的算法,地址:http://www.cnblogs.com/jiny-z/archive/2007/08/07/846019.html

奶牛问题:
一只刚出生的小牛,4年后生一只小牛,以后每年生一只。
现有一只刚出生的小牛,问20年后共有牛多少只?

这位园友是用递归实现的,我却想到实际上可以通过创建奶牛对象,赋给它们生小牛的方法,然后让它们自己去“生”,于是实现代码如下,代码是JavaScript写的:

 

 1function CaleCow(iYear)
 2{
 3    //奶牛对象数组
 4    var arrCow=[];
 5    
 6    //定义一个奶牛类,构造函数初始化奶牛的出生年份
 7    var oCow=function(Birth){
 8        this.iBirth=Birth;
 9    }
;
10    //奶牛类里面的一个方法:生奶牛
11    oCow.prototype.CreateCow=function(CurrentYear)
12    {
13        if(CurrentYear-this.iBirth>=4)
14        {
15            return "Create Cow";
16        }

17    }

18    
19    //最开始的一头奶牛
20    arrCow.push(new oCow(0));
21    
22    //每年轮询奶牛数组,让奶牛生小牛
23    for(var i=1;i<=iYear;i++)
24    {
25        for(var j=0;j<arrCow.length;j++)
26        {
27            if(arrCow[j].CreateCow(i)=="Create Cow")
28            {
29                arrCow.push(new oCow(i));
30            }

31        }

32    }

33    
34    //奶牛数组的长度就是奶牛的头数
35    alert(arrCow.length);
36}

 

我在推算过程中,发现奶牛的数量增长是有规律的,这个规律和斐波那契数列很像,所以如果只是为了得到数值而忽略掉业务逻辑方面的东西,那么代码可以直接写成:

 

 1function Cale(iYear)
 2{
 3    //定义数组,数组元素为每年的奶牛总数
 4    var arrCow=[];
 5    
 6    //初始的一头奶牛
 7    arrCow[0]=1;
 8    
 9    //奶牛每年增长
10    for(var i=1;i<=iYear;i++)
11    {
12        if(i<4)    //前三年每年都只有一头奶牛
13        {
14            arrCow[i]=1;
15        }

16        else
17        {
18            //第四年开始奶牛的增长方式
19            arrCow[i]=arrCow[i-1]+arrCow[i-4];
20        }

21    }

22    alert(arrCow[iYear]);
23}

 

抱歉!评论已关闭.