Я пытаюсь реализовать код, который возвращает сумму всех простых чисел менее 2 миллионов. У меня есть метод isPrime (int x), который возвращает true, если число является простым. Вот оно:Ошибка переполнения стека в рекурсии Java
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 Я попытался использовать цикл, но проблема была в том, что я попытался 2 миллиона, ничего не произошло. Он пытался завершить код, но это заняло много времени. Вот почему я переключился на рекурсию. – ninesalt