【发布时间】:2015-08-19 14:01:23
【问题描述】:
我正在尝试实现一个返回 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:像这样的正常数字运算但对于更大的数字?我递归地写了这个,因为我认为它会更有效率,但它仍然不起作用。
【问题讨论】:
-
您听说过 Erathostene 的筛子吗?
-
你有什么理由不使用循环吗?你不可能有这么大的递归深度。你会填满你的整个堆栈,这就是你得到堆栈溢出异常的原因。
-
@XaverKapeller 我尝试使用循环但问题是当我尝试 200 万时,什么也没发生。它试图完成代码,但需要很长时间。这就是我切换到递归的原因。
-
你甚至没有真正使用递归......你知道你的代码实际上在做什么吗?我非常怀疑。我花了几分钟来理解它,所以我对你遇到问题并不感到惊讶。只要说这个程序没有做你认为它正在做的事情就足够了。
-
这甚至不是真正适合递归的问题。无论您对循环有什么问题,这都是开始的地方。您现在所拥有的任何解决方案都非常遥远,解决这个问题不是要走的路。