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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top