Data Structure and Algorithm
Recursion
1
Tower of Hanoi
• Can move only one disk at a time
• Can not put bigger disk on smaller disk
2
Tower of Hanoi
• 1 Disks (Source: A, Destination: C)
A B C
3
Tower of Hanoi
• 1 Disks (Source: A, Destination: C)
– Move a disk from A to C
A B C
4
Tower of Hanoi
• 2 Disks (Source: A, Auxiliary: B, Destination: C)
A B C
5
Tower of Hanoi
• 2 Disks (Source: A, Auxiliary: B, Destination: C)
– Move a disk from A to B
A B C
6
Tower of Hanoi
• 2 Disks (Source: A, Auxiliary: B, Destination: C)
– Move a disk from A to B
– Move a disk from A to C
A B C
7
Tower of Hanoi
• 2 Disks (Source: A, Auxiliary: B, Destination: C)
– Move a disk from A to B
– Move a disk from A to C
– Move a disk from B to C
A B C
8
Tower of Hanoi
• 3 Disks
A B C
9
Tower of Hanoi
• 3 Disks
– Move 2 disks from A to B (Source: A, Auxiliary: C, Destination: B)
A B C
10
Tower of Hanoi
• 3 Disks
– Move 2 disks from A to B (Source: A, Auxiliary: C, Destination: B)
– Move a disk from A to C
A B C
11
Tower of Hanoi
• 3 Disks
– Move 2 disks from A to B (Source: A, Auxiliary: C, Destination: B)
– Move a disk from A to C
– Move 2 disks from B to C (Source: B, Auxiliary: A, Destination: C)
A B C
12
Tower of Hanoi
• n Disks (Recursive)
– Move n-1 disks from A to B (Source: A, Auxiliary: C, Destination: B)
– Move a disk from A to C
– Move n-1 disks from B to C (Source: B, Auxiliary: A, Destination: C)
A B C
13
• n Disks (Recursive)
– Move n-1 disks from A to B (Source: A, Auxiliary: C, Destination: B)
– Move a disk from A to C
– Move n-1 disks from B to C (Source: B, Auxiliary: A, Destination: C)
void TOH(int n, char A, char B, char C)
{
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
14
• n Disks (Recursive)
– Move n-1 disks from A to B (Source: A, Auxiliary: C, Destination: B)
– Move a disk from A to C
– Move n-1 disks from B to C (Source: B, Auxiliary: A, Destination: C)
void TOH(int n, char A, char B, char C)
{
TOH(n-1, A, C, B);
printf(“MoveSourcea disk from %d to %d”, A, C);
Destination
TOH(n-1, B, A, C);
No of Disk
} Auxiliary
15
TOH( 3, ‘A’, ‘B’, ‘C’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
16
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
17
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘A’, ‘B’, ‘C’)
18
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘A’, ‘B’, ‘C’)
19
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
A to C
20
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘A’, ‘B’, ‘C’)
X
X
Move a disk from
A to C
21
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
A to C
22
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
A to C
23
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
X
A to C
24
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
X
A to C
Move a disk from
C to B
25
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{
if(n==0)
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
X X
A to C
Move a disk from
C to B
26
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
X X
A to C
Move a disk from
C to B
27
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
X X
A to C
Move a disk from
C to B
28
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
X X
A to C
TOH( 1, ‘B’, ‘C’, ‘A’)
Move a disk from
C to B
29
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
X X
A to C
TOH( 1, ‘B’, ‘C’, ‘A’)
Move a disk from
C to B
X
30
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
X X
A to C
TOH( 1, ‘B’, ‘C’, ‘A’)
Move a disk from
C to B
X
Move a disk from 31
B to A
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
X X
A to C
TOH( 1, ‘B’, ‘C’, ‘A’)
Move a disk from
C to B
X
X
Move a disk from 32
B to A
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X
Move a disk from
X X
A to C
TOH( 1, ‘B’, ‘C’, ‘A’)
Move a disk from
Move a disk from B to C
C to B
X
X
Move a disk from 33
B to A
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X X
A to C
TOH( 1, ‘B’, ‘C’, ‘A’)
Move a disk from
Move a disk from B to C
C to B
X
X
Move a disk from 34
B to A
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X X
A to C
X
TOH( 1, ‘B’, ‘C’, ‘A’)
Move a disk from
Move a disk from B to C
C to B
X
X
Move a disk from 35
B to A
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X X
A to C
X
TOH( 1, ‘B’, ‘C’, ‘A’)
Move a disk from
Move a disk from B to C
C to B
X Move a disk from
A to C
X
Move a disk from 36
B to A
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return;
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X A to B
X TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
X X
A to C
X
TOH( 1, ‘B’, ‘C’, ‘A’)
X
Move a disk from
Move a disk from B to C
C to B
X Move a disk from
A to C
X
Move a disk from 37
B to A
TOH( 3, ‘A’, ‘B’, ‘C’)
TOH( 2, ‘B’, ‘A’, ‘C’)
TOH( 2, ‘A’, ‘C’, ‘B’)
void TOH(int n, char A, char B, char C)
{ Move a disk from
if(n==0) A to C
return; 4
TOH(n-1, A, C, B);
printf(“Move a disk from %d to %d”,A,C);
TOH(n-1, B, A, C);
}
TOH( 1, ‘C’, ‘A’, ‘B’)
TOH( 1, ‘A’, ‘B’, ‘C’)
Move a disk from
A to B
2
Move a disk from
A to C TOH( 1, ‘B’, ‘C’, ‘A’)
TOH( 1, ‘A’, ‘B’, ‘C’)
1
Move a disk from
B to C
Move a disk from 6
C to B
3
3 Move a disk from
Move a disk from A to C
B to A
5 38 7