(nota che sto ponendo la domanda qui perché riguarda la meccanica concettuale di essa, piuttosto che un problema di codifica)
Stavo lavorando a un piccolo programma, che utilizzava una sequenza di numeri di fibonacci nella sua equasion, ma ho notato che se ho superato un certo numero è diventato dolorosamente lento, googling un po 'mi sono imbattuto in una tecnica in Haskell conosciuta come Memoization
, hanno mostrato il funzionamento del codice 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 dell'elenco prima che il calcolo raggiunga? Ma se haskell è pigro, non c'è davvero alcun calcolo che deve recuperare ... Quindi, come funziona?
the calculation catches up
? A proposito, la memoization non è specifica di haskell: en.wikipedia.org/wiki/Memoization