19 Stimmen

Reverse in Haskell implementieren, das in linearer Zeit läuft

Ich bin gerade lernen Haskell, so sorry, wenn meine Frage ist dumm. Ich lese gerade learnyouahaskell.com und bin jetzt bei Kapitel 5 "Rekursion". Es gibt ein Beispiel für die Implementierung der Standardfunktion "reverse":

reverse' :: [a] -> [a]  
reverse' [] = []  
reverse' (x:xs) = reverse' xs ++ [x]  

Aber es scheint, dass es in O(N^2) Zeit läuft, während die Standardumkehr in O(N) läuft (ich hoffe es). Der folgende Code veranschaulicht dies:

sum (reverse [1,2..1000000]) -- runs pretty fast
sum (reverse' [1,2..1000000]) -- never finishes

Also habe ich mir überlegt, wie ich meinen eigenen Rückwärtsgang schneller einführen kann. In imperativen Sprachen ist das ziemlich einfach zu bewerkstelligen. Vielleicht brauche ich dazu etwas fortgeschritteneres Material aus späteren Kapiteln? Jeder Hinweis ist willkommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X