Próbuję zaimplementować kod, który zwraca sumę wszystkich liczb pierwszych poniżej 2 milionów. Mam metodę isPrime (int x), która zwraca wartość true, jeśli liczba jest liczbą pierwszą. Oto ona:Błąd przepełnienia stosu w rekursji Java
public static boolean isPrime(int x) {
for (int i = 2; i < x; i++) {
if (x % i == 0) {
return false;
}
}
return true;
}
A druga metoda, która próbuję wdrożyć rekurencyjnie, działa tylko do pewnej liczby, na ten numer i pojawia się błąd przepełnienia stosu. Najwyższy kod dostałem do pracy za 10 000.
Oto ona:
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;
}
Więc dlaczego pojawia się błąd przepełnienia stosu, gdy liczba robi się coraz większy i jak mogę sobie z tym poradzić? Jak zwykle radzisz sobie z pisaniem kodu dla tak dużych liczb? IE: normalne operacje numeryczne takie jak to, ale dla większych liczb? Napisałem to rekursywnie, ponieważ uważałem, że będzie bardziej wydajne, ale nadal nie będzie działać.
Słyszałeś o sicie Erathostene za? –
Czy jest jakiś powód, dla którego nie używasz pętli? Nie możesz mieć tak dużej głębokości rekurencji. Napełnisz cały stos, dlatego otrzymasz wyjątek Stack Overflow. –
@XaverKapeller Próbowałem użyć pętli, ale problem był, gdy próbowałem 2 miliony, nic się nie stało. Próbował ukończyć kod, ale trwało to długo. Dlatego przestawiłem się na rekurencję. – ninesalt