Le funzioni ricorsive non sono così semplici da capire ma ci si riesce solo faccendo molti esercizi. Una funzione ricorsiva non conosce lo stadio precedente ed è questo che a te ti frega. Perche tu sai qual'è lo stato precedente.
1. void muovi(int n, int sorgente, int destinazione, int ausiliario)
2. {
3. if (n == 1)
4. muoviUnDisco(sorgente, destinazione);
5. else {
6. muovi(n-1, sorgente, ausiliario, destinazione);
7. muoviUnDisco(sorgente, destinazione);
8. muovi(n - 1, ausiliario, destinazione, sorgente);
9. }
10. }
Prendiamo in esame il tuo caso.
n = 3, sorgente=1, destinazione=3 e ausiliario=2
passo 1:
siamo nel else: muovi(2, 1, 2, 3); //muovi 1 stage (riga nr.6)
questo fa si che la prossima esecuzione sarà una nuovo funzione muovi e sarai sempre caduto nello stesso else: muovi(1, 1, 2, 3); //muovi 2 stage (riga nr.6)
questo fa si che la prossima esecuzione sarà una nuovo funzione muovi e sarai caduto
nel if: muoviUnDisco(1, 3); // muovi 3 stage (riga nr.4)
adesso questo if finisce e ti posizioni nel muovi stage 2
dentro l'else: muoviUnDisco(1, 3); //muovi 2 stage (riga nr.7)
dentro l'else: muovi(1, 2, 3, 1); //muovi 2 stage (riga nr.8 )
ecc fino ad uscire da tutta la trappola delle funzioni ricursive. Insomme te l'ho abbreviato un pò perche diventava lungo ma il procedimento dovresti averlo capito.