java - Java递归中的堆栈溢出错误

标签 java stack overflow

我正在尝试实现一个代码,该代码返回 200 万以下所有素数的总和。我有一个 isPrime(int x) 方法,如果数字是质数,它会返回 true。在这里:

public static boolean isPrime(int x) {

        for (int i = 2; i < x; i++) {

            if (x % i == 0) {
                return false;
            }

        }
        return true;

    }

我尝试递归实现的另一种方法只能工作到一定数量,超过该数量我会收到堆栈溢出错误。我让代码运行的最高值是 10,000。

这里是:

public static int sumOfPrimes(int a) {

    if (a < 2000000) {  //this is the limit

        if (isPrime(a)) {
            return a + sumOfPrimes(a + 1);

        } else {
            return sumOfPrimes(a + 1);
        }

    }
    return -1;
}

那么为什么当数字变大时会出现堆栈溢出错误,我该如何处理呢? 另外,您通常如何处理为如此大的数字编写代码? IE:像这样的正常数字操作,但对于更大的数字?我递归地写了这个,因为我认为它会更有效率,但它仍然无法工作。

最佳答案

你的isPrime函数效率很低,它不必去x,去x的平方根就够了。

但这不是您的解决方案不起作用的原因。递归深度不能达到 100 万。

我会使用 sieve of eratosthenes 迭代地解决这个问题并循环遍历生成的 boolean 数组。

关于java - Java递归中的堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32097717/

相关文章:

java - Apache Thrift 2-way SSL 相互认证

java - 数字常量在 SQL 中无效

arrays - 为什么我们应该使用堆栈,因为数组或链表可以完成堆栈可以执行的所有操作

C++ long long int 上溢/下溢

java - as(Function<? super Mono<T>,P> 转换器) 的用法是什么

java - 数组从一个类克隆到主类

Android: fragment 和返回堆栈

c - 为什么使用两个堆栈的队列不起作用?

jquery-plugins - 带有 img 标签的多行文本溢出 :ellipsis in CSS or JS,

c# - 在检查 block 中调用的方法中没有溢出异常