(зауважте, я ставлю питання тут, оскільки це стосується концептуальної механіки цього, а не проблеми кодування)
Я працював над невеликою програмою, яка використовувала послідовність цифр розрядів у своєму зрівнянні, але я помітила, що якщо я пережила певну кількість, вона стає болісно повільною, гуляючи трохи, натрапила на техніку в Haskell, відому як 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/Перемістка