我对堆栈有点新意,所以我不太清楚我是否完全理解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次迭代后终止。在使用循环会更有效的情况下是否存在错误?
答案 0 :(得分:2)
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个堆栈帧深,具体而言。