java - 修复 Java 中的 StackOverflowError

标签 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 次迭代后终止。这本身是否有错误,使用循环会更有效?

最佳答案

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/

相关文章:

java - 如何使用 java 的 String.replaceAll(String, String) 方法将 "<br><br><br><br><br><br>"之类的字符串转换为 "<br>"?

javascript - JS中递归调用函数的次数

python - 解决硬币上的动态规划问题

java - 如何在 Java Spring MVC 创建时将大量数据作为文件提供?

java - 无法从 java 连接到 mysql。 mysql在另一个系统中

java - Libgdx : Exported desktop jar file link to external path instead jar root

java - 使用 Java 递归分解,处理 StackOverflow

c++ - "printf("%s 行的内存漏洞应该是 %s", argv[1]);"被描述为堆栈溢出?

java - 错误: Package ae. awt.java不存在

java - 如何在递归中避免 StackOverFlow?