N年后有多少只兔子的问题

今天在博客园看到一个题目,

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



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值