Ruby 版ハノイの塔

前回のエントリーでプログラムしたハノイの塔を Ruby で書いてみた。

def hanoi(n, from, work, to)
  if n == 0
    []
  else
    hanoi(n-1, from, to, work) +
    [[n, from, to]] +
    hanoi(n-1, work, from, to)
  end
end

hanoi(3,"A","B","C").each{|x| print x[0],": ",x[1]," -> ",x[2];puts}

実行例は次のようになる。

$ ruby hanoi.rb
1: A -> C
2: A -> B
1: C -> B
3: A -> C
1: B -> A
2: B -> C
1: A -> C

記述の簡潔さは Haskell と同じくらいだろう。Haskell の記述の簡潔さの要因が、言語の仕様ばかりではなく再帰的定義の多用によるものではないかと思わせる例だ。


今日のHaskell
mylength [] = 0
mylength (x:xs) = 1 + mylength xs

実行例
Hugs> :l mylength.hs
Main> mylength [1,2,3]
3

リストのサイズを調べる関数の定義。Haskell の関数の定義は再帰関数が多用される。
[PR]
by tnomura9 | 2010-11-21 02:03 | Haskell | Comments(0)
<< Haskell と数学パズル ハノイの塔 >>