(nota che sto ponendo la domanda qui perché riguarda la meccanica concettuale di essa, piuttosto che un problema di codifica)
Stavo lavorando su un piccolo programma, che utilizzava una sequenza di numeri di fibonacci nella sua equazione, ma ho notato che se avessi superato un certo numero diventava dolorosamente lento, facendo googling un po 'mi sono imbattuto in una tecnica in Haskell noto come Memoization
, hanno mostrato che il codice funziona in questo modo:
-- 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)
Quindi la mia domanda per voi ragazzi è, come o piuttosto perché funziona?
È perché in qualche modo riesce a scorrere la maggior parte della lista prima che il calcolo raggiunga il livello? Ma se haskell è pigro, non c'è davvero alcun calcolo che deve recuperare ... Quindi come funziona?