ハノイの塔(Perl版)

http://twitter.com/tomotaka_ito/status/24445961129
後輩がやってる課題作成のやつをやってみたらハノイの塔をPerlで解くというお題だったので挑戦してみた。

$n = $ARGV[0];
print "N = $n\n";
$s=[[],[],[]];
for($i=$n;1<=$i;$i--){push(@{$s[0]},$i);}
sub movehanoi {
  my ($f, $t, $d) = @_;
  print "movehanoi($f, $t, $d)\n";
  my @x = (1, 1, 1);
  $x[$f] = 0;
  $x[$t] = 0;
  my $tmp = -1;
  for (my $i = 0; $i < 3; $i++) {
    if ($x[$i] == 1) {
      $tmp = $x[$i];
      last;
    }
  }

  if ($d == 1) {
    $popped = pop(@{$s[$f]});
    push(@{$s[$t]}, $popped);
    printstack();
  } else {
    movehanoi($f, $tmp, $d-1);
    movehanoi($f, $t, 1);
    movehanoi($tmp, $t, $d-1);
  }
}

sub printstack {
  print "-------------\n";
  for ($i =0; $i < 3; $i++) {
    print "s[$i]=[".join(",", @{$s[$i]})."]\n";
  }
}

printstack();
movehanoi(0, 2, $n);