Sto tentando di implementare un codice che restituisce la somma di tutti i numeri primi inferiori a 2 milioni. Ho un metodo isPrime (int x) che restituisce true se il numero è primo. Eccolo:Errore di overflow dello stack nella ricorsione Java
public static boolean isPrime(int x) {
for (int i = 2; i < x; i++) {
if (x % i == 0) {
return false;
}
}
return true;
}
E l'altro metodo, che sto cercando di implementare in modo ricorsivo, funziona solo fino ad un certo numero, più di quel numero e ottengo un errore di overflow dello stack. Il massimo che ho ottenuto è che il codice funzionasse per 10.000.
Eccolo:
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;
}
Allora perché ottengo un errore di overflow dello stack quando il numero diventa più grande e come posso fare con questo? Inoltre, come si fa normalmente a scrivere codice per numeri così grandi? IE: operazioni con numeri normali come questo, ma per numeri più grandi? Ho scritto questo in modo ricorsivo perché pensavo che sarebbe stato più efficiente ma non funzionerebbe ancora.
Avete sentito parlare setaccio del Erathostene? –
C'è qualche ragione per non usare un loop? Non puoi avere una profondità di ricorsione così grande. Si riempirà l'intero stack, motivo per cui si ottiene un'eccezione Stack Overflow. –
@XaverKapeller Ho provato ad usare un loop ma il problema era quando ho provato 2 milioni, non è successo nulla. Stava cercando di completare il codice ma ci voleva molto tempo. Ecco perché sono passato alla ricorsione. – ninesalt