再帰関数とループ

Ruby で1からnまでの数列の和を求める関数を書いてみよう。

$ irb
irb(main):001:0> def sum_l(n, total = 0)
irb(main):002:1>   for i in 1..n
irb(main):003:2>     total += i
irb(main):004:2>   end
irb(main):005:1>   total
irb(main):006:1> end
=> nil
irb(main):007:0> sum_l(10)
=> 55

これを再帰関数で記述するとこうなる。

irb(main):008:0> def sum_r(n)
rb(main):009:1>   if n == 1 then 1
irb(main):010:2>   else n + sum_r(n-1) end
irb(main):011:1> end
=> nil
irb(main):012:0> sum_r(10)
=> 55

インタープリタの内部で何が起きているかを問題にしないなら、sum_l(n) も sum_r(n) も同じように、引数10 をとると戻り値 55 を返してくる。なにも再帰関数による定義はHaskell 固有のものではなく、 Ruby でも同じように記述できる。

Haskell の再帰関数によるループの記述が奇異に見えたとしても、Haskell の問題ではなく、単に自分たちが再帰関数による繰り返しの定義に慣れていないということを意味しているにすぎない。

Haskell を使うのに抵抗を感じなくなるコツは、上のように繰り返しを再帰関数で記述するとどうなるかということを、繰り返し考えることだ。


今日のHaskell
module Face
where

data Face = Face
instance Show Face where
show x = "(~~);"

実行例
Hugs> :l face.hs
Face> print a where a = Face
(~~);

instance の使い方の例。決まりごとが多いので説明が難しいが、自分で定義したデータ型を表示する時の様子をプログラムする方法。
[PR]
by tnomura9 | 2010-11-25 08:27 | Haskell | Comments(0)
<< 思考補助電卓としてのHaskell Ruby でパターンプログラミング >>