修复Java中的StackOverflowError

时间:2016-11-09 19:46:08

标签: java recursion stack-overflow

我对堆栈有点新意,所以我不太清楚我是否完全理解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次迭代后终止。在使用循环会更有效的情况下是否存在错误?

1 个答案:

答案 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个堆栈帧深,具体而言。