Example: The Towers of Hanoi

Contents | Up | Prev | Next

# 10.1. Example: The Towers of Hanoi

In this example, which is intended to give a taste of the capabilities of references, we will solve the well-known Towers of Hanoi problem. (Refer to the link to learn more about the problem.) The number of disks can be inputted from the command-line. The towers themselves will be represented as an array of three elements, each of which is a reference to an array.

We will use the recursive solution in which in order to move a column of $N disks, we first move the upper column with $N-1 disks and then move the bottom most disk, and then move the $N-1 disks-long column on top of it.

Here goes:

    use strict;
    use warnings;

    my $num_disks = shift || 9;

    my @towers = (
        [ reverse(1 .. $num_disks) ],  # A [ ... ] is a dynamic reference to
        [ ],                           # an array
        [ ]
        );

    sub print_towers
    {
        for(my $a=0;$a<3;$a++)
        {
            print ": ";
            print join(" ", @{$towers[$a]}); # We de-reference the tower
            print "\n";
        }
        print "\n\n";
    }

    sub move_column
    {
        my $source = shift;
        my $dest = shift;
        my $how_many = shift;

        if ($how_many == 0)
        {
            return;
        }
        # Find the third column
        my $intermediate = 0+1+2-$source-$dest;
        move_column($source, $intermediate, $how_many-1);
        # Print the current state
        print_towers();
        # Move one disk. Notice the dereferncing of the arrays
        # using @{$ref}.
        push @{$towers[$dest]}, pop(@{$towers[$source]});
        move_column($intermediate, $dest, $how_many-1);
    }

    # Move the entire column
    move_column(0,1,$num_disks);
    print_towers();

Contents | Up | Prev | Next