(uwaga: zadaję to pytanie, ponieważ dotyczy ono mechaniki pojęciowej, a nie problemu z kodowaniem)
Pracowałem nad małym programem, który wykorzystywał sekwencję liczb Fibonacciego w swojej równowadze, ale zauważyłem, że jeśli przekroczyłem pewną liczbę, robi się to boleśnie powolne, przeglądając trochę, natknąłem się na technikę w Haskell znaną jako Memoization
: pokazali kod działający w następujący sposób:
-- 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)
Więc moje pytanie do was brzmi: jak, a raczej dlaczego to działa?
Czy to dlatego, że jakoś udaje mu się przejrzeć większość listy przed obliczeniem? Ale jeśli haskell jest leniwy, tak naprawdę nie ma żadnych kalkulacji, które trzeba nadrobić ... Więc jak to działa?
the calculation catches up
? BTW, zapamiętywanie nie jest specyficzne dla haskell: en.wikipedia.org/wiki/Memoization