我试图了解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);
}
答案 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
,因为除数变得非常大。