再帰的にプロセスと反復的プロセス
問題1.11は、次の定義を再帰的プロセスと反復的プロセスで書けというもの
n < 3 のとき f(n) = n n >= 3 のとき f(n) = f( n -1 ) + 2f(n -2) + 3f(n-3)
では、再帰的方法の実装から
saikiF n | n < 3 = n |otherwise = saikiF ( n-1 ) + 2 * (saikiF ( n -2 )) + 3 * ( saikiF ( n -3 )) *Main> saikiF 2 2 *Main> saikiF 5 25 *Main> saikiF 10 1892
このやりかただと、saikiF(n-1),saikiF(n-2),saikiF(n-3)を実行していくときに、同じ計算を何度も行うことにより、効率がわるくなってしまいます。(ただ、Haskellは処理系がメモ化を行うから、そこまで遅く ないというのを読んだことがあります。あいまいなので、誰か情報お持ちでしたら教えてください)
というわけで、この関数を反復処理に直します。
hanpuku a b c d | d == 0 = c |otherwise = hanpuku ( a + ( 2*b) + (3*c)) a b (d -1) hanpukuF n = hanpuku 2 1 0 n *Main> hanpukuF 2 2 *Main> hanpukuF 5 25 *Main> hanpukuF 10 1892