java - Java递归和人口增长模型
问题描述
在我们的 Java 类中,我们必须创建一个递归方法来计算最终人口。我使用的增长率等式是: = -1 + (1 - -1/)-1 其中 P 是人口,r 是增长率,K 是最大人口。
下面的代码是我的代码。下面的代码是需要通过的测试。
我的测试不会通过,说expected <2080> but was <2100>
当我使用我的计算器时,方程可以正常工作。我把东西放错了顺序吗?
public static int calculateEndPopulation(int startPopulation, int maxPopulation, double growthFactor, int periods)
{
if(periods == 0)
{
return startPopulation;
}
else
{
startPopulation = (int) (startPopulation + (startPopulation*(growthFactor*(1-(startPopulation/maxPopulation)))));
}
return calculateEndPopulation(startPopulation, maxPopulation, growthFactor, periods-1);
}
需要通过的测试如下:
assertEquals(2000, Recursion.calculateEndPopulation(2000, 10000, 0.05, 0));
assertEquals(2080, Recursion.calculateEndPopulation(2000, 10000, 0.05, 1));
assertEquals(2162, Recursion.calculateEndPopulation(2000, 10000, 0.05, 2));
assertEquals(2246, Recursion.calculateEndPopulation(2000, 10000, 0.05, 3));
解决方案
问题是强制转换会int
截断结果,使其不准确。改为使用double
会产生所需的结果。
public static double calculateEndPopulation(double startPopulation, int maxPopulation, double growthFactor, int periods) {
if (periods == 0) {
return startPopulation;
} else {
startPopulation = (startPopulation + (startPopulation * (growthFactor * (1 - (startPopulation / maxPopulation)))));
}
return calculateEndPopulation(startPopulation, maxPopulation, growthFactor, periods - 1);
}
在相关的说明中,在测试双打是否相等时,您应该使用 epsilon(与实际值的最大可接受绝对差)。
//For example
assertEquals(2080, Recursion.calculateEndPopulation(2000, 10000, 0.05, 1), 1e-3);
推荐阅读
- python - Keras - 在输出前获取最后一层
- c# - 从 Api 获取图像并在 Razor 视图中显示
- javascript - 在 html/JS 中展开或关闭内容 - 需要显示部分内容
- spring - 为什么spring boot应用程序的一对多关系中子集合为空?
- python - Keras 中不同超参数的相同预测
- php - 使用 php mysql 上传文件并将文件名列明智地保存在 db 中
- c++ - 附加包含目录的问题
- css - td 的边框未显示在自动换行断词上
- bash - 创建选项卡完成脚本。在一种情况下,我想将完成用于另一个命令(例如 git),这可能吗?
- django - Django ManyToManyField 批准添加