Towers of Hanoi is a popular mathematical puzzle invented in 1883 by French mathematician Eduoardo Lucas. It is also a popular example in coding world because it is a typical example where a recursive solution is much easier than iterative solution.
In the puzzle, there are 3 rods and n discs of different sizes. The puzzle starts with the disks in a neat stack in ascending order of size on one rod, the smallest at the top, thus making a conical shape.
Aim of the game is to transfer these n discs to the 3rd rod, using 2nd rod as temporary location, but keeping in mind that
How do we solve this puzzle?
If some how we move n-1 discs to 2nd rod in correct order, we only have largest disc in 1st rod. And it can be moved to 3rd rod.
So now we need to find a method of moving n-1 discs from 1st rod to 2nd rod in correct order. Again we can use 3rd rod for intermediate storage. Why don't we move n-2 rods from 1st to 3rd rod and then we only have to move n-1th disc from 1st to 2nd rod.
So this is recursion. And we can write our algorithm as
move_discs is called recursively for n-1 discs for moving from from rod to middle rod. And then nth rod is moved - which is represented by printf function.
next move_discs is called recursively for n-1 discs for moving from middle rod to to rod.
The base case is when n is 0, where recursion is not called.
For 3 discs, the output appears like this
And here we have driver program.
In the puzzle, there are 3 rods and n discs of different sizes. The puzzle starts with the disks in a neat stack in ascending order of size on one rod, the smallest at the top, thus making a conical shape.
Gif file from wikipedia |
- only one disc can be moved at a time.
- a larger disc can not be placed above a smaller disc.
How do we solve this puzzle?
If some how we move n-1 discs to 2nd rod in correct order, we only have largest disc in 1st rod. And it can be moved to 3rd rod.
So now we need to find a method of moving n-1 discs from 1st rod to 2nd rod in correct order. Again we can use 3rd rod for intermediate storage. Why don't we move n-2 rods from 1st to 3rd rod and then we only have to move n-1th disc from 1st to 2nd rod.
So this is recursion. And we can write our algorithm as
- recursively move n-1 discs from source rod to extra rod
- move nth disc from source rod to target rod
- recursively move n-1 discs from extra rod to target rod
void move_discs(int numdisks,char from,char to, char middle)
{
if(numdisks>0){
move_discs(numdisks-1,from,middle,to);
printf("Move disk %d from rod %c to rod %c\n",numdisks,from,to);
move_discs(numdisks-1,middle,to,from);
}
}
move_discs is called recursively for n-1 discs for moving from from rod to middle rod. And then nth rod is moved - which is represented by printf function.
next move_discs is called recursively for n-1 discs for moving from middle rod to to rod.
The base case is when n is 0, where recursion is not called.
For 3 discs, the output appears like this
aa@dell:~/dsPrograms$ ./a.out
Enter the number of discs3
Move disk 1 from rod A to rod C
Move disk 2 from rod A to rod B
Move disk 1 from rod C to rod B
Move disk 3 from rod A to rod C
Move disk 1 from rod B to rod A
Move disk 2 from rod B to rod C
Move disk 1 from rod A to rod C
And here we have driver program.
#include<stdio.h>
void move_discs(int numdisks,char from,char to, char middle)
{
if(numdisks>0){
move_discs(numdisks-1,from,middle,to);
printf("Move disk %d from rod %c to rod %c\n",numdisks,from,to);
move_discs(numdisks-1,middle,to,from);
}
}
int main()
{
int n;
printf("Enter the number of discs");
scanf("%d",&n);
move_discs(n,'A','C','B');
return 0;
}
Comments
Post a Comment