ich Haskell lerne, und ich schrieb eine einfache Fibonacci-Funktion:Haskell Fibonacci scheint langsam
fib :: Int -> Int
fib 1 = 1
fib 0 = 0
fib n = (fib (n-1)) + (fib (n-2))
Es scheint ok zu kompilieren, und Laden des Skripts in die GHCI REPL ich konnte herumspielen mit ein paar Zahlen . Ich versuchte
fib 33
und war überrascht, dass es etwa 4 Sekunden gedauert um das Ergebnis zu geben. (Entschuldigung, ich weiß noch nicht, wie ich eine Funktion in Haskell einstellen soll, also zählte ich selbst).
Fib 33 ist nicht besonders anstrengend. Die Antwort ist weniger als 4 Millionen. Also ich nehme an, dass mein Code nicht sehr gut geschrieben ist oder es gibt ein Problem mit der Art, wie ich Rekursion mache (naja, es ist nicht gut geschrieben, da es negative ganze Zahlen nicht berücksichtigt). Die Frage ist, warum ist es langsam? Jede Hilfe wird geschätzt.
Diese Frage scheint für Codereview ein guter zu sein. – Alexander
Wenn Sie sich Ihren Code anschauen, stellen Sie sich vor, wie oft zum Beispiel 'fib (5)' berechnet wird. Bei jeder Iteration berechnen Sie alle "inneren" Fibonacci-Zahlen erneut. – WeSt
Sie sollten die klassische Lazy Infinite-Version verwenden: 'fibs = 0: 1: zipWith (+) fibs (tail fibs)' mit 'fib n = fabs !! n'. Siehe [das Haskell-Wiki über die Fibonacci-Sequenz] (https://www.haskell.org/haskellwiki/The_Fibonacci_sequence).Es ist amüsant, dass Fibonacci für diese Sequenz berühmt ist, die nur eine kleine Übung in dem Buch war, für das er berühmt sein sollte, das in Westeuropa einen Stellenwert einführte. – AndrewC