(notez que je pose la question ici parce qu'il s'agit de la mécanique conceptuelle de celui-ci, plutôt que d'un problème de codage)
Je travaillais sur un petit programme, qui utilisait une séquence de nombres de fibonacci dans son équasion, mais j'ai remarqué que si je dépassais un certain nombre, cela devenait douloureusement lent, en parcourant un peu les choses Memoization
, je suis tombé sur une technique à Haskell connue sous le nom de , ils ont montré que le code fonctionnait comme ceci:
-- 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)
Donc, ma question est la suivante: comment ou plutôt pourquoi cela fonctionne-t-il?
Est-ce parce qu'il parvient en quelque sorte à parcourir la majeure partie de la liste avant que le calcul ne rattrape? Mais si haskell est paresseux, il n'y a pas vraiment de calcul à rattraper ... Alors comment ça marche?
the calculation catches up
? BTW, la mémorisation n'est pas spécifique à haskell: en.wikipedia.org/wiki/Memoization