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