24. セク ショ ン 6
参考:メモ化の例
※仮想コードです。このままでは動作しません。
cache = Hash.new
def fib n
return n.even? ? -fib(-n) : fib(-n) if n < 0
return n if n < 2
cache[n] ||= n.even? ?
(cache[n/2-1]*2 + cache[n/2]) * cache[n/2] :
cache[n/2]**2 + cache[n/2+1]**2
end
Point: 計算結果をキャッシュに保持。2回目以降はキャッシュ値を利用。
23
25. セク ショ ン 7
参考:末尾再帰の例
※仮想コードです。このままでは動作しません。
def fib n
return n.even? ? -fib(-n) : fib(-n) if n < 0
fib_iter 1, 0, 0, 1, n
end
def fib_iter a, b, p, q, c
return b if c.zero?
case c
when even; p, q, c = p**2 + q**2, (2*p+q)*q, c/2
else a, b, c = b*q + a*q + a*p, b*p + a*q, c-1
end
fib_iter a, b, p, q, c
end
Point: 再帰呼び出しを最後に1回だけにする(呼び出し回数削減)。
※処理系によっては末尾再帰に対して最適化コンパイルが実施されさらに高速化。
24