codewar 小镇人口增长

人口增长问题

在人口基数 p0 = 1000 的小镇上,每年定期增长2%;每年有 50 个新居民来小镇居住,城镇需要多少年居民人数能大于等于1200?

第一年有:
1000 + 1000 * 0.02 + 50 => 1070 居民
第二年有:
1070 + 1070 * 0.02 + 50 => 1141 居民
第三年有:
1141 + 1141 * 0.02 + 50 => 1213 居民
所以在第三年就达到大于等于 1200

所以给定人口基数 p0,每年增长率 percent,每年新来或离开的居民人数 aug,最后的目标数 p。封装一个函数,输入以上参数,可以得到几年可以获得大于等于 p 的人数。
用递归做


function nbYear(p0, percent, aug, p) {
    var num = 0;
    // your code
    if(p0 < p){
      p0 = p0 + p0 * percent * 0.01 + aug;
      num++;
      num += nbYear(p0, percent, aug, p)
    }
    return num;
}

测试用例
Test.assertEquals(nbYear(1500, 5, 100, 5000), 15);
Test.assertEquals(nbYear(1500000, 2.5, 10000, 2000000), 10);
Test.assertEquals(nbYear(1500000, 0.25, 1000, 2000000), 94);

遇到的问题:num清零,在一开始定义了 num = 0; 在递归的时候就会不断重复生成局部变量 num,最外层 num 返回的是 1。
如果在函数之外设置全局变量 num = 0,那么生成的结果会叠加,上一次返回的 num 数会加上这次返回的 num 数,导致结果出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值