フィボナッチ数計算(続 再帰的・反復的)

再帰的プロセスは、計算の木構造をめいっぱい展開することになる。
だから再帰的プロセスより反復的プロセスのほうが低コスト。
以下、反復的プロセスが、再帰的プロセスよりも低コストになる典型例

  • 再帰版フィボナッチ数計算
-- フィボナッチ数(高コスト)
myfib_r n = case n of
              0 -> 0
              1 -> 1
              _ -> myfib_r (n-2) + myfib_r (n-1)

(myfib_r 5) を計算するときに(myfib_r 4)と(myfib_r 3)を計算している。(myfib_r 4)では、(myfib_r 3)の値を計算している。(myfib_r 5)を計算するときに求める(myfib_r 3)は、(myfib_r 4)を計算するときに求める(myfib_r 3)を利用せず、別に1から計算しなおしている。だから、引数nが大きくなればなるほど高コスト。しかもフィボナッチ数は指数関数的に増える。

  • 反復版フィボナッチ数計算
-- フィボナッチ数(低コスト)
myfib_i n = let
            {
              myfib_iter a b cnt
                = case cnt of
                    0 -> b
                    _ -> myfib_iter (a+b) a (cnt-1)
            } in myfib_iter 1 0 n