首页 > 解决方案 > 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));

标签: javarecursion

解决方案


问题是强制转换会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);

推荐阅读