用java递归解决谐波因子序列

时间:2016-12-02 12:42:59

标签: java recursion

我试图了解reqursion,但我找到了一项任务,我几天都无法解决。

X = 1/1 + 1 /(1 * 2)+ 1 /(1 * 2 * 3)+ 1 /(1 * 2 * 3 * 4)+ 1 /(1 * 2 * 3 * 4 * 5).....

如果没有条件运算符,如何解决100次重复?

没有递归就可以解决吗?

我已尝试使用此代码,但它无法正常运行且包含"如果"。

public static double harFac(double n) {
    if (n == 1) return 1;
    return (1.0 / (n * harFac(n - 1))) + harFac(n - 1);
}

3 个答案:

答案 0 :(得分:2)

我相信你可以这样做:

double result = 0;
int div = 1;
for (int i = 1; i <= 100; i++){
    result += 1.0 / div; /*the division needs to take place in floating point*/
    div *= i+1; 
}

答案 1 :(得分:1)

如果你评估这样的分母,​​你会很快遇到麻烦,因为它会很快达到极限。使用浮点时,首先评估较小的术语也是一个好主意。

幸运的是,您可以通过将表达式重新设置为

来解决这两个问题

1 * (1 + 1/2 * ( 1 + 1/3 * (1 + 1/4 * ( ... ) ) ) )

所以你的最后一个词在递归中是foo = 1 + 1.0/100,递归中的倒数第二项是1 + 1/98 * foo,依此类推。

我个人不会使用递归来解决这个问题,而是在单个函数中使用循环。

答案 2 :(得分:0)

你沿着正确的路线走,但你不应该两次打电话给harFac。你需要改为计算除数。但是,如果没有if条件,我无法看到你如何做到这一点。

public static double harFac(double n)
{
    if (n == 1) return 1;

    int divisor = 1;
    for (int i = 2; i <= n; ++i) divisor *= i;

    return (1.0 / divisor) + harFac(n - 1);
}

这不会超过n = 30,因为除数变得非常大。