在博客园上看到一位园友在讨论奶牛问题的算法,地址:http://www.cnblogs.com/jiny-z/archive/2007/08/07/846019.html
奶牛问题:
一只刚出生的小牛,4年后生一只小牛,以后每年生一只。
现有一只刚出生的小牛,问20年后共有牛多少只?
这位园友是用递归实现的,我却想到实际上可以通过创建奶牛对象,赋给它们生小牛的方法,然后让它们自己去“生”,于是实现代码如下,代码是JavaScript写的:
1
function 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
}
function 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
}
我在推算过程中,发现奶牛的数量增长是有规律的,这个规律和斐波那契数列很像,所以如果只是为了得到数值而忽略掉业务逻辑方面的东西,那么代码可以直接写成:
1
function 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
}
function 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
else17
{18
//第四年开始奶牛的增长方式19
arrCow[i]=arrCow[i-1]+arrCow[i-4];20
}21
}22
alert(arrCow[iYear]);23
}



浙公网安备 33010602011771号