Ich versuche, die Kinder eines Baumes in Haskell umzukehren. Der Baum sieht wie folgt aus:Haskell: Wie reverse ich die Kinder eines Baumes rekursiv
data Tree v e = Node v [(e,Tree v e)]
Im Moment habe ich es mit diesen beiden Funktionen zu tun:
rev :: Tree v e -> Tree v e
rev (Node v []) = Node v []
rev (Node v xs) =
let xs' = (rev'(snd (unzip xs)))
in Node v (zip (fst (unzip xs)) (map rev xs'))
rev' :: [Tree v e] -> [Tree v e]
rev' [] = []
rev' (x:xs) = (rev' xs) ++ [x]
Ich bin nicht einmal sicher, ob dies zu 100% funktioniert. Gibt es eine Möglichkeit, es in nur einer Funktion rekursiv zu machen? Ich fühle mich wie mein Weg ist ineffizient. Ich habe versucht, eine Funktion zu schreiben, die wie folgt aussieht:
revRec :: Tree v e -> Tree v e
revRec (Node v []) = Node v []
revRec (Node v (x:xs)) = Node v (revRec xs ++ [x])
obviosuly kann ich nicht nennen revRec
mit xs
seit xs
eine Liste. Ich kann mich nicht um dieses Problem kümmern, obwohl ich das Gefühl habe, dass es nicht so schwer sein könnte.
Erstens haben auch Sie nicht brauchen die 'rev (Knoten v []) = .. 'die allgemeinen Listenfälle decken auch den leeren Listenfall ab. Zweitens scheint die Verwendung von 'unzip' durchaus sinnvoll - die Verwendung von 'fst' und' snd' (auch mehrere Aufrufe von 'unzip') sollte wahrscheinlich eliminiert werden. Sie können es mit primitiver Rekursion schreiben, zB durch. 'rev (Knoten a ts) = Knoten a $ uncurry (\ xy -> zip x (y [])) $ foldr (\ (e, t) (as, bs) -> (e: wie, bs. (rev t :))) ([], id) ts'. Aber ich bezweifle wirklich, dass dies effizienter ist als die "unzip/reverse" Version (und es ist sicherlich hässlicher). – user2407038