今天在博客园看到一个题目,
C# 算兔子的算法 要求用递归,面试题
为简单,我用JS写了一个求解,没有使用递归,先说下题目:
一对小兔子一年后长成大兔子;一对大兔子每半年生一对小兔子。大兔子的繁殖期为4年,兔子的寿命是6年。假定第一年年初投放了一对小兔子,试编程计算,第n年末总共会有多少对兔子。n由键盘输入。(用递归哦,谢谢!)
下面是我的推理:
假设小兔子是r,成年兔子是R,兔子与年份的关系可以表示为一下谓词:
C=[];//兔子队列
C.push(r);
R=year( r,1);
r=year(R,0.5);
r=year(R,1);
r=year(R,1.5);
r=year(R,2);
r=year(R,2.5);
r=year(R,3);
r=year(R,3.5);
r=year(R,4);
year(R,4.5);
year(R,5);
year(R,5.5);
year(R,6);
C.pop(R);
可以写一个函数 Rabbit 方便的解决这个问题:
function Rabbit(gen){
this.Age=0;
this.Gen = gen;
this.ID = ++ID_Number;
this.Grow=function()
{
this.Age+=0.5;
if(this.Age>=1 && this.Age<=4)
return new Rabbit(this.Gen+1);
else if(this.Age>=6)
return null;
else
return this;
}
this.Show = function () {
return "第"+this.Gen+ " 代兔子["+this.ID+"]年龄现在是:" + this.Age ;
}
}
整个求解的JS代码如下:
var ID_Number = 0;
function Rabbit(gen){
this.Age=0;
this.Gen = gen;
this.ID = ++ID_Number;
this.Grow=function()
{
this.Age+=0.5;
if(this.Age>=1 && this.Age<=4)
return new Rabbit(this.Gen+1);
else if(this.Age>=6)
return null;
else
return this;
}
this.Show = function () {
return "第"+this.Gen+ " 代兔子["+this.ID+"]年龄现在是:" + this.Age ;
}
}
var Allyear = 7;
var rabbitFamily = [new Rabbit(0)];
var message = "";
//debugger;
for (var year = 0; year < Allyear; year += 0.5) {
message += "<br>----------现在年份是:200"+year+"----------------<br>";
var allCount=rabbitFamily.length;
for (var i = 0; i < allCount; i++) {
var currRabbit = rabbitFamily[i];
if (currRabbit != null) {
var result = currRabbit.Grow();
message += "<br>" + currRabbit.Show();
if (result == null) {
rabbitFamily[i] = null; //兔子死亡
message += " |<b>年寿已到</b>";
}
else if (result != currRabbit) {
rabbitFamily.push(result); //出生了小兔子,加入大家庭
message += " |<b>生小兔子了...</b>ID=" + result.ID;
}
}
}
}
message += "<br>=========开始统计================<br>";
var allCount = 0;
for (var i = 0; i < rabbitFamily.length; i++) {
if (rabbitFamily[i] != null) {
allCount++;
message += "<br>No." + allCount + ":" + rabbitFamily[i].Show();
}
}
document.getElementById("Message").innerHTML = message;
alert("总共有兔子数量:"+allCount);
计算结果是有570只兔子,下面给出前3年的计算过程:
----------现在年份是:2000----------------
第0 代兔子[1]年龄现在是:0.5
----------现在年份是:2000.5----------------
第0 代兔子[1]年龄现在是:1 |生小兔子了...ID=2
----------现在年份是:2001----------------
第0 代兔子[1]年龄现在是:1.5 |生小兔子了...ID=3
第1 代兔子[2]年龄现在是:0.5
----------现在年份是:2001.5----------------
第0 代兔子[1]年龄现在是:2 |生小兔子了...ID=4
第1 代兔子[2]年龄现在是:1 |生小兔子了...ID=5
第1 代兔子[3]年龄现在是:0.5
----------现在年份是:2002----------------
第0 代兔子[1]年龄现在是:2.5 |生小兔子了...ID=6
第1 代兔子[2]年龄现在是:1.5 |生小兔子了...ID=7
第1 代兔子[3]年龄现在是:1 |生小兔子了...ID=8
第1 代兔子[4]年龄现在是:0.5
第2 代兔子[5]年龄现在是:0.5
----------现在年份是:2002.5----------------
第0 代兔子[1]年龄现在是:3 |生小兔子了...ID=9
第1 代兔子[2]年龄现在是:2 |生小兔子了...ID=10
第1 代兔子[3]年龄现在是:1.5 |生小兔子了...ID=11
第1 代兔子[4]年龄现在是:1 |生小兔子了...ID=12
第2 代兔子[5]年龄现在是:1 |生小兔子了...ID=13
第1 代兔子[6]年龄现在是:0.5
第2 代兔子[7]年龄现在是:0.5
第2 代兔子[8]年龄现在是:0.5
----------现在年份是:2003----------------
第0 代兔子[1]年龄现在是:3.5 |生小兔子了...ID=14
第1 代兔子[2]年龄现在是:2.5 |生小兔子了...ID=15
第1 代兔子[3]年龄现在是:2 |生小兔子了...ID=16
第1 代兔子[4]年龄现在是:1.5 |生小兔子了...ID=17
第2 代兔子[5]年龄现在是:1.5 |生小兔子了...ID=18
第1 代兔子[6]年龄现在是:1 |生小兔子了...ID=19
第2 代兔子[7]年龄现在是:1 |生小兔子了...ID=20
第2 代兔子[8]年龄现在是:1 |生小兔子了...ID=21
第1 代兔子[9]年龄现在是:0.5
第2 代兔子[10]年龄现在是:0.5
第2 代兔子[11]年龄现在是:0.5
第2 代兔子[12]年龄现在是:0.5
第3 代兔子[13]年龄现在是:0.5
----------现在年份是:2003.5----------------
第0 代兔子[1]年龄现在是:4 |生小兔子了...ID=22
第1 代兔子[2]年龄现在是:3 |生小兔子了...ID=23
第1 代兔子[3]年龄现在是:2.5 |生小兔子了...ID=24
第1 代兔子[4]年龄现在是:2 |生小兔子了...ID=25
第2 代兔子[5]年龄现在是:2 |生小兔子了...ID=26
第1 代兔子[6]年龄现在是:1.5 |生小兔子了...ID=27
第2 代兔子[7]年龄现在是:1.5 |生小兔子了...ID=28
第2 代兔子[8]年龄现在是:1.5 |生小兔子了...ID=29
第1 代兔子[9]年龄现在是:1 |生小兔子了...ID=30
第2 代兔子[10]年龄现在是:1 |生小兔子了...ID=31
第2 代兔子[11]年龄现在是:1 |生小兔子了...ID=32
第2 代兔子[12]年龄现在是:1 |生小兔子了...ID=33
第3 代兔子[13]年龄现在是:1 |生小兔子了...ID=34
第1 代兔子[14]年龄现在是:0.5
第2 代兔子[15]年龄现在是:0.5
第2 代兔子[16]年龄现在是:0.5
第2 代兔子[17]年龄现在是:0.5
第3 代兔子[18]年龄现在是:0.5
第2 代兔子[19]年龄现在是:0.5
第3 代兔子[20]年龄现在是:0.5
第3 代兔子[21]年龄现在是:0.5