• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
射落满天繁星
博客园    首页    新随笔    联系   管理    订阅  订阅
奶牛问题

在博客园上看到一位园友在讨论奶牛问题的算法,地址: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}

 

posted on 2009-07-08 00:11  zixr365  阅读(3181)  评论(21)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3