in reply to cannot follow hanoi subroutine
The technique is to use recursion. Maybe it is clearer if we get the code to actually move the "rings" and show the state of the piles after each move? Consider:
#!/usr/bin/perl -w use strict; use warnings; my %piles = (A => [reverse 1..3], B => [], C => []); dumpPiles (); hanoi (scalar @{$piles{A}}, keys %piles); sub hanoi { my ($n, $start, $end, $extra) = @_; if ($n == 1) { report ($start, $end); } else { hanoi($n-1, $start, $extra, $end); report ($start, $end); hanoi($n-1, $extra, $end, $start); } } 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"; } }
Prints:
A: 3 2 1 B: C: Moved disk 1 from A to C. A: 3 2 B: C: 1 Moved disk 2 from A to B. A: 3 B: 2 C: 1 Moved disk 1 from C to B. A: 3 B: 2 1 C: Moved disk 3 from A to C. A: B: 2 1 C: 3 Moved disk 1 from B to A. A: 1 B: 2 C: 3 Moved disk 2 from B to C. A: 1 B: C: 3 2 Moved disk 1 from A to C. A: B: C: 3 2 1
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: cannot follow hanoi subroutine
by convenientstore (Pilgrim) on Nov 05, 2007 at 04:32 UTC | |
by GrandFather (Saint) on Nov 05, 2007 at 09:15 UTC | |
by graq (Curate) on Nov 05, 2007 at 09:03 UTC | |
by Anonymous Monk on Nov 05, 2007 at 09:10 UTC |