Entschuldigung, wenn diese Frage bereits gestellt wurde, habe ich es nicht gefunden. Und Entschuldigung für mein schlechtes Englisch.Haskell List Komplexität
Ich lerne Haskell und versuche, Listen zu verwenden. Ich habe eine Funktion geschrieben, die eine Liste nach einem bestimmten Muster transformiert, ich kann nicht überprüfen, ob es jetzt funktioniert, aber ich denke schon.
Diese Funktion ist kein Schwanz Anruffunktion, so denke ich, es schrecklich sein wird, diese Funktion mit einer großen Liste zu berechnen:
transform :: [Int] -> [Int]
transform list = case list of
(1:0:1:[]) -> [1,1,1,1]
(1:1:[]) -> [1,0,1]
[1] -> [1,1]
(1:0:1:0:s) -> 1:1:1:1: (transform s)
(1:1:0:s) -> 1:0:1: (transform s)
(1:0:s) -> 1:1: (transform s)
(0:s) -> 0: (transform s)
Also habe ich über eine andere Funktion gedacht, das wäre „besser“:
transform = reverse . aux []
where
aux buff (1:0:[1]) = (1:1:1:1:buff)
aux buff (1:[1]) = (1:0:1:buff)
aux buff [1] = (1:1:buff)
aux buff (1:0:1:0:s) = aux (1:1:1:1:buff) s
aux buff (1:1:0:s) = aux (1:0:1:buff) s
aux buff (1:0:s) = aux (1:1:buff) s
aux buff (0:s) = aux (0:buff) s
Das Problem ist, dass ich nicht weiß, wie es kompiliert und wenn ich falsch mit der zweiten Funktion bin. Kannst du mir erklären, wie Listen funktionieren? Ist es besser, am Ende die Liste zu verwenden (++) oder die Liste umzukehren?
Vielen Dank im Voraus für Ihre Antworten
siehe auch http://en.wikipedia.org/wiki/Tail_call#Tail_recursion_modulo_cons; http: // Stapelüberlauf.com/questions/13042353/does-haskell-have-tail-rekursive-Optimierung. –