Solving tower of Hanoi using Recursive method

While it is possible to solve the problem using either recursion or iteration , it is fundamental thing that every programmer should know is to when to use what.

Definition-

Recursive function – is a function that is partially defined by itself and consists of some simple case with a known answer. Example: Fibonacci number sequence, factorial function, quick sort and more.
Some of the algorithms/functions can be represented in an iterative way and some may not.

Iterative functions – are loop based imperative repetitions of a process (in contrast to recursion which has a more declarative approach).

Example –

Calculating factorial is a good example which can be solved by both the methods.

//recursive function calculates n!
static int FactorialRecursive(int n)
{
    if (n <= 1) return 1;
    return n * FactorialRecursive(n - 1);
}

//iterative function calculates n!
static int FactorialIterative(int n)
{
    int sum = 1;
    if (n <= 1) return sum;
    while (n > 1)
    {
        sum *= n;
        n--;
    }
    return sum;
}

In general recursive calls are more expensive ( in terms of CPU cycles) then iterative calls. In above example of course the iterative approach is the best to use. But look at following problem –

Tower of Hanoi
The Tower of Hanoi is a mathematical game or puzzle. It consists of three rods, and a number of disks of different sizes which can slide onto any rod. 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.
The objective of the puzzle is to move the entire stack to another rod, obeying the following rules:

  • Only one disk may be moved at a time.
  • Each move consists of taking the upper disk from one of the rods and sliding it onto another rod, on top of the other disks that may already be present on that rod.
  • No disk may be placed on top of a smaller disk.

    Recursive solution
    A key to solving this puzzle is to recognize that it can be solved by breaking the problem down into a collection of smaller problems and further breaking those problems down into even smaller problems until a solution is reached. For example:

  • move n−1 discs from A to B. This leaves disc n alone on peg A
  • move disc n from A to C
  • move n−1 discs from B to C so they sit on disc n

    Python Script

    def printMove(fr, to):
        print('move from ' + str(fr) + ' to ' + str(to))
    
    def Towers(n, fr, to, spare):
        if n == 1:
            printMove(fr, to)
        else:
            Towers(n-1, fr, spare, to)
            Towers(1, fr, to, spare)
            Towers(n-1, spare, to, fr)