Implementare C++
Codul sursă complet și explicat pentru algoritmul recursiv.
hanoi.cpp
#include <iostream>
using namespace std;
// Funcția recursivă pentru Turnurile din Hanoi
// n: numărul de discuri
// from_rod: tija sursă
// to_rod: tija destinație
// aux_rod: tija auxiliară
void towerOfHanoi(int n, char from_rod, char to_rod, char aux_rod) {
// Cazul de bază: dacă avem un singur disc, îl mutăm direct
if (n == 1) {
cout << "Mută discul 1 de pe tija " << from_rod
<< " pe tija " << to_rod << endl;
return;
}
// Pasul 1: Mută n-1 discuri de pe sursă pe auxiliar
towerOfHanoi(n - 1, from_rod, aux_rod, to_rod);
// Pasul 2: Mută discul n (cel mai mare) de pe sursă pe destinație
cout << "Mută discul " << n << " de pe tija " << from_rod
<< " pe tija " << to_rod << endl;
// Pasul 3: Mută cele n-1 discuri de pe auxiliar pe destinație
towerOfHanoi(n - 1, aux_rod, to_rod, from_rod);
}
int main() {
int n;
cout << "n="; cin >> n;
cout << "Rezolvarea pentru " << n << " discuri:" << endl;
towerOfHanoi(n, 'A', 'C', 'B'); // A, B și C sunt numele tijelor
return 0;
}Explicații Detaliate
Semnătura funcției:
Funcția primește 4 parametri: numărul de discuri n și caracterele care identifică cele 3 tije (Sursă, Destinație, Auxiliar).
Cazul de bază (n=1):
Când a mai rămas un singur disc de mutat, îl mutăm pur și simplu de la sursă la destinație. Aceasta este condiția de oprire a recursivității.
Apelurile recursive:
Observați cum se schimbă rolul tijelor în apelurile recursive. În primul apel, tija auxiliară devine destinație temporară. În al doilea apel, tija auxiliară devine sursă.
Complexitate
Timp: O(2^n)
Numărul de mutări crește exponențial cu numărul de discuri.
Spațiu: O(n)
Spațiul este utilizat de stiva de apeluri recursive, care are o adâncime maximă egală cu n.