Ich möchte eine Sequenz in Clojure umkehren, ohne die Funktion reverse
zu verwenden, und dies rekursiv tun.
Hier ist, was ich gefunden habe:
%Vor%Beispielausgabe:
%Vor%Fragen:
Referenzen:
Was ist der beste Weg, um rekursiv umzukehren eine Zeichenfolge in Java?
acc
nicht vorbelegen, da die ursprüngliche Eingabe möglicherweise leer ist (und es ist mehr Code). Wie für loop
/ recur
und acc
benötigen Sie eine Möglichkeit, die reverse Arbeitsliste zu umgehen. Es ist entweder loop
oder fügt der Funktion einen weiteren Parameter hinzu (was wirklich loop
tut).
Oder verwenden Sie eine Funktion höherer Ordnung:
%Vor%Ja zu Frage 1, das ist, was ich für meine Antwort auf das Rekursionskoan gefunden habe (ich konnte Ihnen nicht sagen, ob es eine gute Clojurepraxis war oder nicht).
%Vor% Aus Gründen der Vollständigkeit gibt es eine weitere Methode, die into
verwendet. Da intern conj
intern verwendet wird, kann es wie folgt verwendet werden:
In der aktuellen Version von Clojure gibt es eine eingebaute Funktion namens rseq
. Für jeden, der vorbeikommt.
Q1.
Die JVM kann die Rekursion nicht optimieren, eine rekursive Funktion, die den Überlauf direkt stapeln würde. Daher in Clojure, die die Schleife / rekurriert. Also, ohne eine Funktion zu verwenden, die Rekursion tief Rekursion kann nicht definiert werden. (das auch intern verwendet wird, um als Funktionstrampolin wiederzukehren.)
Q2.
Eine rekursive Funktion von recur, muss tail-rekursiv sein. Wenn die normale rekursive Funktion in tail-rekursive Funktion wechselt, so muss etwa der Wert einer Variablen als Akkumulator mitgeführt werden.