(Beachten Sie, dass ich die Frage hier stelle, da es sich eher um die konzeptionelle Mechanik als um ein Codierungsproblem handelt.)
Ich arbeite an einem kleines Programm, das eine Folge von Fibonacci - Zahlen in seinem equasion Verwendung wurde, aber ich merkte , dass , wenn ich eine bestimmte Anzahl überwindet es quälend langsam bekam, googeln um ein wenig ich auf eine Technik , die in Haskell als bekannt gestolpert Memoization
, Sie zeigten Code, der so funktioniert:
-- 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)
Meine Frage an euch ist also, wie oder warum funktioniert das?
Liegt es daran, dass es irgendwie gelingt, den größten Teil der Liste zu durchlaufen, bevor die Berechnung aufholt? Aber wenn Haskell faul ist, gibt es nicht wirklich eine Berechnung, die nachholen muss ... Also, wie funktioniert es?
the calculation catches up
? Übrigens ist Memoization nicht spezifisch für Haskell: en.wikipedia.org/wiki/Memoization