ハノイの塔(Ruby版)
N = ARGV[0].to_i $s = [[],[],[]] N.downto(1){|i| $s[0] << i } def printstack puts "-----------" (0..2).each{|i| puts "s[#{i}]=[#{$s[i].join(",")}]" } end def movehanoi(f, t, d) puts "movehanoi(#{f}, #{t}, #{d})" tmp = ([0, 1, 2] - [f, t])[0] if d == 1 then $s[t] << $s[f].pop printstack else movehanoi(f, tmp, d-1) movehanoi(f, t, 1) movehanoi(tmp, t, d-1) end end puts "N = #{N}" printstack movehanoi(0, 2, N)
一時的にd-1のスタックをおきたい場所(tmp)を求める演算がPerlに比べて集合演算でさくっと求められるので楽ですね。Perlでも素敵なライブラリをuseすれば簡単にできそうですが、詳しくないので...すいません。