Ich versuche, in Clojure mit nichttrivialen (d. h. nicht Fibonacci), aber überschaubaren Beispielen, eine Korrekur zu finden. Anscheinend ist es möglich, Binärbaum-Traversal mit Corecursion zu implementieren. Wikipedia hat ein Beispiel in Python, das ich nicht verstehen kann.
Wie kann ich es in Clojure implementieren? Nehmen wir an, ich suche nach BFS, aber es könnte eine beliebige Reihenfolge sein.
Folgendes habe ich bisher:
%Vor%Leider scheint es den ganzen Weg nach links zu gehen, den rechten Zweig ignorierend.
Wenn Michals Code das tut, was Sie wollen, funktioniert das auch:
%Vor% Hier ist eine direkte Übersetzung der Funktion bftrav
Haskell aus dem Wikipedia-Artikel. Beachten Sie, dass es ein letrec
Makro verwendet, das ich gerade geschrieben habe - siehe diesen Gist für die neueste Version.
Ich habe Ihre Definition von my-tree
geändert, um so zu lesen:
Auch meine leaf?
-Funktion setzt voraus, dass es sich nur um echte Zweiwege-Zweige und Blattknoten handelt (ein nil
im Zweig :left
bedeutet also nil
im Zweig :right
) ; Es sollte nicht schwierig sein, dies zu ändern, um Single-Child-Zweige zu behandeln:
Der Code für bftrav
lautet wie folgt:
Ein Beispiel aus der REPL:
%Vor%