我对堆栈有点陌生,所以我不太确定我是否完全理解 StackOverflowError 的含义。我确实读到它主要发生在永不结束的递归中。
public double calculateLeibniz(double pi, double x, long l) {
if (l == 10000) {
return pi;
}
if (l % 2 == 0) {
pi -= (1.0/x);
return calculateLeibniz(pi, x + 2.0, l + 1);
} else {
pi += (1.0/x);
return calculateLeibniz(pi, x + 2.0, l + 1);
}
}
我正在尝试使用 Leibniz 方法计算 PI,并认为我会尝试锻炼我的递归能力。我不确定为什么它会返回错误,因为该方法设置为在 10000 次迭代后终止。这本身是否有错误,使用循环会更有效?
最佳答案
10000 是一个相当深的筹码!毫无疑问,JVM 在您达到“极限”之前就已经崩溃了。我建议您以迭代方式而不是递归方式重新实现您的方法。像这样的……
public double calculateLeibniz(double pi, double x, int l) {
while (l < 10000) {
if (l % 2 == 0) {
pi -= 1.0/x;
} else {
pi += 1.0/x;
}
x += 2.0;
++l;
}
return pi;
}
在这种情况下,您的算法的堆栈深度非常浅:具体而言,深度为 1 个堆栈帧。
关于java - 修复 Java 中的 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40514799/