Perché questo ciclo non termina?
Domanda
Ecco il codice di esempio:
public static void col (int n)
{
if (n % 2 == 0)
n = n/2 ;
if (n % 2 != 0)
n = ((n*3)+1) ;
System.out.println (n) ;
if (n != 1)
col (n) ;
}
questo funziona bene fino a quando si arriva fino a 2. allora emette 2 4 2 4 2 4 2 4 2 4
infinitamente. mi sembra che se 2 viene inserito come n poi (n % 2 == 0)
vale 2 sarà diviso per 2 a 1. yeild poi 1 saranno stampati e poiché (n != 1)
è falso il ciclo termina.
Perché non è successo?
Soluzione 8
Oltre a una else if
per governare la condizione che n è dispari che stessa linea ha anche bisogno & n != 1
essere aggiunto ad esso destinate ai condizionale. Quindi questo:
else if (n % 2 != 0 & n != 1)
Altri suggerimenti
Perché quando si arriva a 1, si stanno moltiplicando per 3 e l'aggiunta di 1, che vi porterà indietro a 4.
Avete bisogno di un altro in là. Non so java, ma sarebbe qualcosa di simile:
public static void col (int n)
{
if (n % 2 == 0)
n = n/2 ;
else if (n % 2 != 0)
n = ((n*3)+1) ;
System.out.println (n) ;
if (n != 1)
col (n) ;
}
EDIT: come accennato nei commenti, è possibile omettere il caso di test dopo il resto:
if (n % 2 == 0)
n = n/2 ;
else
n = ((n*3)+1) ;
Credo che si dovrà modificare l'istruzione secondo if
a un else
if (n % 2 == 0) // if the n is even
n = n/2 ;
else // if n is odd
n = ((n*3)+1) ;
La risposta alla domanda può essere letto direttamente nel codice:
Assume n is 2
(n % 2 == 0) is true therefore n <- 1
(n % 2 != 0) is also true therefore 4 <- n
this warrants a call to function with n = 4, which is then changed to 2 and
"back to square 1"
da sostituendo la seconda prova da un altro , a risolvere questo problema logica, a costo di possibile causa più ricorsione (poiché nella logica corrente, due operazioni sono talvolta eseguite in un'iterazione). Tale soluzione avrà risolvere anche una più sottile bug , che è che nella versione attuale non tutti i nuovi valori di n vengono stampati.
Ora, per il credito supplementare, dimostrare che non importa il valore iniziale di n, il numero di ricorsione è finito (cioè la sequenza converge a 1). ; -)
Utilizzare if / then / else. La logica è sbagliata.
quando l'ingresso è di 2:
if (n % 2 == 0) //true
n = n/2; //n = 1
if (n % 2 != 0) //true
n = ((n*3)+1); //n = 4
System.out.println (n); //prints 4
if (n != 1) //true
col (n); //call col(4)
Funziona se si cambia a questo?
if (n % 2 == 0)
n = n/2 ;
else if (n % 2 != 0)
n = ((n*3)+1) ;
Sembra che stai ricevendo 2, dividendo per 2 per ottenere 1, quindi il controllo per vedere se 1/2 ha un resto (lo fa), e moltiplicandolo per 3 e l'aggiunta di 1, per ottenere 4 ... .
if (n% 2! = 0) n = ((n * 3) +1);
questo codice è ancora una volta implementato ogni volta u ottenere 1.
dunque la funzione ricorsiva sarà chiamata ripetutamente quindi portando ad una chiamata rec infinita e codice non terminerà mai.