Your skill will accomplishwhat the force of many cannot PerlMonks

### Re^3: cannot follow hanoi subroutine

by graq (Curate)
 on Nov 05, 2007 at 09:03 UTC ( #648974=note: print w/ replies, xml ) Need Help??

First all, apologies for ruining some nice code. I have added a print statement and 4 comment points (A .. D).

```#!/usr/bin/perl -w
use strict;
use warnings;

my %piles = (A => [reverse 1..3], B => [], C => []);

dumpPiles ();
hanoi (scalar @{\$piles{A}}, keys %piles); #A

sub hanoi {
my (\$n, \$start, \$end, \$extra, \$recursion) = @_;
print "Hanoi: Disk \$n\n";
if (\$n == 1) { #B
report (\$start, \$end, \$recursion);
} else {
hanoi(\$n-1, \$start, \$extra, \$end); #C
report (\$start, \$end, \$recursion);
hanoi(\$n-1, \$extra, \$end, \$start); #D
}
}

sub report {
my (\$start, \$end) = @_;
my \$disk = pop @{\$piles{\$start}};

print "Moved disk \$disk from \$start to \$end.\n";
push @{\$piles{\$end}}, \$disk;
dumpPiles ();
}

sub dumpPiles {
for my \$pile (sort keys %piles) {
print "\$pile: @{\$piles{\$pile}}\n";
}
}

The first hanoi call happens at point A, where the first argument (which disk to move) is equal the number of discs on pile A; namely '3'. We then move into the hanoi iterative method where the logical statement at B is false and we move to point C.

At point C we call hanoi again (note we have not called report yet, but the first argument has been decremented to '2'. This means we arrive at point B for the second time and the logical statement is still false.

We arrive at point C again, calling hanoi on disk number 1. Now the statement at B is true and the iterations begin to unravel.

Perhaps, together with the additional print statement in the code, this will help to explain things?

-=( Graq )=-

Comment on Re^3: cannot follow hanoi subroutine

Create A New User
Node Status?
node history
Node Type: note [id://648974]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (12)
As of 2015-08-03 16:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?