Re: Torre di Hanoi ricorsione

Messaggioda axpgn » 19/06/2019, 11:46

Non devi osservare un'animazione ma devi farlo tu, così capisci dove vai a sbattere (eventualmente)!
axpgn
Cannot live without
Cannot live without
 
Messaggio: 13692 di 40641
Iscritto il: 20/11/2013, 22:03

Re: Torre di Hanoi ricorsione

Messaggioda ZfreS » 19/06/2019, 12:04

Ok, supponendo di averne 3, faccio così: da A-C, A-B, C-B, A-C, B-A, B-C, A-C. Come vedi non cambio da B a C e da C a B.
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1741 di 4589
Iscritto il: 22/10/2016, 17:52

Re: Torre di Hanoi ricorsione

Messaggioda axpgn » 19/06/2019, 12:42

Secondo te quella sarebbe una simulazione del funzionamento del programma ? #-o :roll:

"Simulazione" vuol dire eseguirlo passo passo ed ad OGNI SINGOLO passo verificare la situazione partendo dallo stato delle variabile e così via ...

Non c'è niente da fare, non hai la minima idea di cosa significhi fare le cose con metodo e attenzione ...
axpgn
Cannot live without
Cannot live without
 
Messaggio: 13693 di 40641
Iscritto il: 20/11/2013, 22:03

Re: Torre di Hanoi ricorsione

Messaggioda ZfreS » 19/06/2019, 12:52

Prima hanoi inzia con n=3 poi chiama se stessa ricorsivamente con n=2 e poicon n=1 dopodichè stampa A-C, ma se metto 4 dischi non stampa più A-C ma A-B anche se il codice direbbe il contario : cout << a << " - " << c << endl; Non mi è chiarissimo come funzioni la ricorsione doppia (perchè poi c'è di nuovo una chiamata ad hanoi)
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1742 di 4589
Iscritto il: 22/10/2016, 17:52

Re: Torre di Hanoi ricorsione

Messaggioda axpgn » 19/06/2019, 13:09

Il fatto che hai scritto tre righe invece di una non cambia la situazione (oltre alla perla "anche se il codice direbbe il contrario : cout << a << " - " << c << endl;" #-o )
Non devi scrivere qua quello che fai, devi metterti lì con calma, eseguire con calma ogni passo e ad ognuno di questi scrivere lo STATO delle cose, dal contenuto delle variabili al punto in cui ti trovi (che NON è banale perché quando chiami un'altra volta la stessa funzione ti ritrovi in un altro mondo, (quasi) del tutto nuovo, con NUOVE variabili anche se potrebbero avere lo stesso nome e ricordandoti che continua ad esistere la funzione "vecchia" (anzi LE funzioni) con le SUE variabili: per esempio con $n=4$ avrai QUATTRO funzioni aperte).
Devi metterti in testa (anche se lo so che è una causa persa) che i problemi NON sono così semplici come ti possono sembrare; anzi, anche quando il problema è semplice, la soluzione può essere tutt'altro che banale.
axpgn
Cannot live without
Cannot live without
 
Messaggio: 13694 di 40641
Iscritto il: 20/11/2013, 22:03

Re: Torre di Hanoi ricorsione

Messaggioda ZfreS » 19/06/2019, 13:14

In effetti questo problema è parecchio complicato da capire sul lato della programmazione, da fare manualmente è facile.Tu hai detto che quando chiami un'altra volta la stessa funzione le variabili cambiano completamente, è qui che probabilmente mi blocco, ma perchè non so come quelle varibili cambiano. Capire il meccanismo della ricorsione nel caso del calcolo del fattoriale è facile, anche con altri esempi come l'ordinamento ma la torre di hanoi è un bagno di sangue!
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1743 di 4589
Iscritto il: 22/10/2016, 17:52

Re: Torre di Hanoi ricorsione

Messaggioda vict85 » 19/06/2019, 13:26

La ricorsione usata da quel programma funziona come una pila. https://it.wikipedia.org/wiki/Pila_(informatica)
Quando fai una chiamata a quella funzione programmi di fare una azione, ma non la fai ancora (il push della pila). L'azione la fai quando stampi il risultato (il pop della pila). Nota infatti che ogni chiamata fa una sola stampa.
vict85
Moderatore
Moderatore
 
Messaggio: 9731 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Torre di Hanoi ricorsione

Messaggioda ZfreS » 19/06/2019, 13:35

Non ho studiato ancora questa struttura dati, ma immagino che il pop sia il disco in cima che viene tolto. Ma una volta spostato il disco in cima sul piolo d'appoggio che in base al codice è C, il penultimo disco (osservando la torre dal basso all'alto) viene spostato dalla prima chiamata ricorsiva o dalla seconda (hanoi(n - 1, b, c, a);)?
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1744 di 4589
Iscritto il: 22/10/2016, 17:52

Re: Torre di Hanoi ricorsione

Messaggioda axpgn » 19/06/2019, 14:04

Se provassi a farlo, manualmente, su carta, passo passo, come ti abbiamo già detto più volte, lo sapresti :wink:
axpgn
Cannot live without
Cannot live without
 
Messaggio: 13695 di 40641
Iscritto il: 20/11/2013, 22:03

Re: Torre di Hanoi ricorsione

Messaggioda ZfreS » 19/06/2019, 14:17

Lo avrei simulato su carta il codice se solo avessi capito come funziona. Dopo l'ultima chiamata ricorsiva della prima funzione: hanoi(n - 1, a, b, c); il programma passa al cout e poi alla seconda funzione che richiamera se stessa n-1 volte? Devo sapere se questo è vero prima di farlo su carta.
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1745 di 4589
Iscritto il: 22/10/2016, 17:52

PrecedenteProssimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite