兔子成熟生育问题

// 起初⼀对兔⼦(已满 1 ⽉),每4个⽉性成熟后⽣育下⼀对兔⼦
// (性成熟后⼀对兔⼦在接下来每⼀个⽉都会⽣育⼀对兔⼦),那么请问理想状态下,第10个⽉总共有
// 多少对兔⼦,如果是5个⽉才性成熟,24个⽉后⼜是多少?同时可以思考是否有通⽤型算法,请给出
// 你的代码;(tip:类和数组)(算法 要满⾜ 1000 个⽉后不卡死)
// 若每 5 个⽉成熟,则每⽉兔⼦数分布如下:
//第 1,2,3,4 个⽉是 1 对
//第 5 个⽉ 是 2 对
// 6 个⽉ 是 3 对
// 7 个⽉ 是 4 对
// 8 个⽉ 是 5 对
// 9 个⽉ 是 6 对
// 10 个⽉ 是 8 对
// 11 个⽉ 是 11 对
// 12 个⽉ 是 15 对 有 4 个兔⼦同时在⽣

类和数组做法

用题目提示类和数组做(也可用数字代替类),此类做法时间复杂度度过高,无法满足计算1000

个月的情况,到60/70左右会消耗15秒以上的时间。

 class rabbit {
     constructor(month) {
         this.month = month;
     }
 } 
function getNum(n, limit) {
     let sum = 0;//已成熟
     let temp = [new rabbit(1)];//未成熟
     while (n > 0) {
         for (let i = 0; i < sum; i++) {
             temp.push(new rabbit(0));
        }
        for (let i = 0; i < temp.length; i++) {
            temp[i].month++;
             if (temp[i].month >= limit) {
                 sum++;
                 temp.splice(i, 1);
                 i--;
             }
         }
         n--;
     }
    return sum + temp.length
 }

滑动数组做法

定义一个大小为limit(成熟期)的数组,数组索引代表每个时期有多少对兔子,最后对数组累加求和得出结果,1000个月耗时0.1s左右。

 

function add(n,limit){
    let arr=new Array(limit).fill(0);
    arr[0]=1;//初始满一月的兔子
    while(n>0){
        let temp=arr.pop();//存储以成熟的可以生的兔子作为当月过后数组首项
        arr.unshift(temp);
        arr[limit-1]+=temp;
        n--;//月末
    }
    // return arr
    return arr.reduce((a,b)=>a+b,0);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值