What is the Tower of Hanoi?
The Tower of Hanoi is a mathematical puzzle. It consists of three rods and N disks. The task is to move all disks to another rod following certain rules:
- Only one disk can be moved at a time.
- Only the uppermost disk can be moved from one stack to the top of another stack or to an empty rod.
- Larger disks cannot be placed on top of smaller disks.
Problem Statement: Program for Tower of Hanoi Algorithm
A diagrammatic illustration of the Tower of Hanoi:
Image Source – Google images
The result is :
Image Source – Google Images.
Recursive Approach
The idea is to use a recursive approach to solve this problem.
Let us try to solve the problem for N = 2.
So, one disk is moved from rod 1 to rod 3. Then the second disk is moved from rod 1 to rod 2 and finally, the first disk is moved again back to rod 2.
Similarly, the problem can be solved recursively for N = 3. Observe the below example.
The minimum number of moves to solve the Tower of Hanoi problem is 2^N – 1, where N is the number of disks.
Dry Run of the above illustration –
- Move disc 1 from tower A to tower B.
- Move disc 2 from tower A to tower C.
- Move disc 1 from tower B to tower C.
- Move Disc 3 from tower A to tower B.
- Move Disc 1 from tower C to tower A.
- Move Disc 2 from tower C to tower B.
- Move Disc 1 from tower A to tower B.
Algorithm
- Let us consider a recursive function that takes the following argument N, the number of disks, to_Rod, which indicates the rod which is moved to, from_rod, denoting the rod from which rod is removed, and aux_rod, denoting the rod which is used for transferring rods from from_rod to to_rod.
- The base case is for N = 1. Move it from source to destination, i.e. from_rod to to_rod.
- Solve the problem recursively by moving disk 1, 2, 3,…, N – 1 i.e. from_rod to aux_rod by recursively calling the function on (N – 1, from_rod, aux_rod, to_rod).
- Now, since the top N – 1 disks have been removed from from_rod, move the last disk from from_rod to to_rod.
- Similarly, again remove the top N – 1 disk from aux_rod to to_rod and recursively call the function on (N – 1, aux_rod, to_rod, from_rod)
- Repeat the above steps until it reaches the base case.
C++ Code for Recursive Approach
void towerOfHanoi(int n, char from_rod, char to_rod, char aux_rod) { if (n == 1) { cout << "Move disk 1 from rod " << from_rod << " to rod " << to_rod<<endl; return; } towerOfHanoi(n - 1, from_rod, aux_rod, to_rod); cout << "Move disk " << n << " from rod " << from_rod << " to rod " << to_rod << endl; towerOfHanoi(n - 1, aux_rod, to_rod, from_rod); } solve(){ TowerOfHanoi(n, 'A', 'C', 'B'); }
Java Code for Recursive Approach
static void towerOfHanoi(int n, char from_rod, char to_rod, char aux_rod) { if (n == 1) { System.out.println("Move disk 1 from rod "+ from_rod+" to rod "+to_rod); return; } towerOfHanoi(n - 1, from_rod, aux_rod, to_rod); System.out.println("Move disk "+ n + " from rod " + from_rod +" to rod " + to_rod ); towerOfHanoi(n - 1, aux_rod, to_rod, from_rod); } solve(){ TowerOfHanoi(n, 'A', 'C', 'B') }
Python Code for Recursive Approach
def TowerOfHanoi(n , from_rod, to_rod, aux_rod): if n == 1: print("Move disk 1 from rod",from_rod,"to rod",to_rod) return TowerOfHanoi(n-1, from_rod, aux_rod, to_rod) print("Move disk",n,"from rod",from_rod,"to rod",to_rod) TowerOfHanoi(n-1, aux_rod, to_rod, from_rod) def solve(): TowerOfHanoi(n, 'A', 'C', 'B');
Time Complexity: O(2^N) where N is the number of disks.
Space Complexity: O(N), as the disks, take up the recursive stack space.
Frequently Asked Questions
Q.1: What are the minimum moves to solve the Tower of Hanoi problem?
Ans: The minimum moves required is 2^N – 1 to move all disks from Source rod A to destination rod B while following the rules.
Q.2: What is the space complexity of the Tower of Hanoi?
Ans: The space complexity is O(N) since, for each recursion, the disks take up N – 1 recursive stack space.