人口增长问题
在人口基数 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 数,导致结果出错。