(コーディングの問題ではなく、概念的なメカニズムに関するものなので、ここに質問を入れています)
私はそのequasionでフィボナッチ数列を使用していた小さなプログラム、に取り組んでいたが、私は特定の数を乗り越えた場合、それは痛々しいほど遅くなったことに気づいた、私はとして知られているハスケルの技術でつまずい少し周りグーグルMemoization
、彼らは次のように動作するコードを示しました:
-- Traditional implementation of fibonacci, hangs after about 30
slow_fib :: Int -> Integer
slow_fib 0 = 0
slow_fib 1 = 1
slow_fib n = slow_fib (n-2) + slow_fib (n-1)
-- Memorized variant is near instant even after 10000
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)
皆さんへの私の質問は、これがどのようにまたはなぜ機能するのかということです。
それは、計算が追いつく前に、なんとかしてリストの大部分を処理することができたからでしょうか?しかし、haskellが遅延している場合、追いつく必要のある計算は実際にはありません...では、どのように動作しますか?
the calculation catches up
ですか?ところで、メモ化はhaskellに固有ではありません:en.wikipedia.org/wiki/