Passa al tema normale
Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

Re: Torre di Hanoi ricorsione

19/06/2019, 11:46

Non devi osservare un'animazione ma devi farlo tu, così capisci dove vai a sbattere (eventualmente)!

Re: Torre di Hanoi ricorsione

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.

Re: Torre di Hanoi ricorsione

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 ...

Re: Torre di Hanoi ricorsione

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)

Re: Torre di Hanoi ricorsione

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.

Re: Torre di Hanoi ricorsione

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!

Re: Torre di Hanoi ricorsione

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.

Re: Torre di Hanoi ricorsione

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);)?

Re: Torre di Hanoi ricorsione

19/06/2019, 14:04

Se provassi a farlo, manualmente, su carta, passo passo, come ti abbiamo già detto più volte, lo sapresti :wink:

Re: Torre di Hanoi ricorsione

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.
Rispondi al messaggio