Buongiorno! Sto studiando la torre di hanoi con l'implementazione ricorsiva, ma non riesco a capirne il funzionamento. Ho capito come funziona il gioco, so come risolverlo manualmente ma non capisco come fa il codice ad effettuare certi passaggi. Uso il c++. Il codice è il seguente:
part: piolo di partenza
app: piolo di appoggio
arr: piolo di arrivo
Provo a spiegare il funzionamento del codice fino al punto del mio dubbio: la funzione t_hanoi viene chiamata nel main con questi parametri: 3, A, C, B. Le lettere indicano i vari pioli. Il piolo di partenza A ha 3 dischi. Una volta chiamata la funzione entra in gioco la if che fallisce dato che i dischi sono 3, quindi si passa a richiamare la funzione nella prima riga dell'else, che chiama t_hanoi con i parametri: 2, A, B, C dopodichè si ripete la if che fallisce poichè ci sono ancora 2 dischi e la funzione richiama se stessa nella prima riga dell'else con i parametri: 1, A, C, B. A questo punto si ripete la if che va a buon fine poichè c'è un disco solo e stampa come prima mossa: A-C. Ora arriva i bello: il programma, invece di andare a ritroso per recuperare le chiamata precedenti lasciate in sospeso sembra che proceda con le altre istruzioni dell'else (non so se salta o no la prima riga). Vorrei che mi spiegaste perchè ciò accade e come dovrebbe continuare dal punto in cui mi sono fermato. vi chiedo questo principalmente perchè non so in che ordine avvengono le altre istruzioni. Pensavo che questo funzionasse come la versione ricorsiva del fattoriale ovvero una volta raggiunto il caso base, si andava a ritroso fino alla prima chiamata che restituiva il risultato. Potrste aiutarmi a capireper favore? Vi ringrazio in anticipo!
Codice:
void t_hanoi(int dischi, char part, char arr, char app)
{
if (dischi == 1)
cout << part << " - " << arr << endl;
else
{
t_hanoi(dischi - 1, part, app, arr);
cout << part << " - " << arr << endl;
t_hanoi(dischi - 1, app, arr, part);
}
}
app: piolo di appoggio
arr: piolo di arrivo
Provo a spiegare il funzionamento del codice fino al punto del mio dubbio: la funzione t_hanoi viene chiamata nel main con questi parametri: 3, A, C, B. Le lettere indicano i vari pioli. Il piolo di partenza A ha 3 dischi. Una volta chiamata la funzione entra in gioco la if che fallisce dato che i dischi sono 3, quindi si passa a richiamare la funzione nella prima riga dell'else, che chiama t_hanoi con i parametri: 2, A, B, C dopodichè si ripete la if che fallisce poichè ci sono ancora 2 dischi e la funzione richiama se stessa nella prima riga dell'else con i parametri: 1, A, C, B. A questo punto si ripete la if che va a buon fine poichè c'è un disco solo e stampa come prima mossa: A-C. Ora arriva i bello: il programma, invece di andare a ritroso per recuperare le chiamata precedenti lasciate in sospeso sembra che proceda con le altre istruzioni dell'else (non so se salta o no la prima riga). Vorrei che mi spiegaste perchè ciò accade e come dovrebbe continuare dal punto in cui mi sono fermato. vi chiedo questo principalmente perchè non so in che ordine avvengono le altre istruzioni. Pensavo che questo funzionasse come la versione ricorsiva del fattoriale ovvero una volta raggiunto il caso base, si andava a ritroso fino alla prima chiamata che restituiva il risultato. Potrste aiutarmi a capireper favore? Vi ringrazio in anticipo!
Ultima modifica: