(обратите внимание, что я задаю вопрос здесь, потому что речь идет о его концептуальной механике, а не о проблеме кодирования)
Я работал над небольшой программой, которая использовала последовательность чисел Фибоначчи в ее уравнении, но я заметил, что, если я набрал определенное число, оно стало мучительно медленным, немного погуглив, я наткнулся на технику в Хаскеле, известную как 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/Memoization