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