Ich weiß, dass es in Clojure syntaktische Unterstützung für das "Benennen" einer anonymen Funktion gibt, wie andere Antworten darauf hingewiesen haben. Ich möchte jedoch einen First-Principles-Ansatz zur Lösung der Frage zeigen, der nicht von der Existenz einer speziellen Syntax in der Programmiersprache abhängt und der in jeder Sprache mit Prozeduren erster Ordnung (lambdas) funktionieren würde.
Grundsätzlich, wenn Sie eine rekursive Funktionsaufruf tun möchten, müssen Sie den Namen der Funktion verweisen, so „anonymous“ (dh namenlos Funktionen) kann nicht zur Durchführung einer Rekursion verwendet werden, es sei denn ... Sie verwenden die Y-Combinator. Here ist eine Erklärung, wie es in Clojure funktioniert.
Lassen Sie mich Ihnen zeigen, wie es mit einem Beispiel verwendet wird. Zunächst wird ein Y-Combinator
, das funktioniert für Funktionen mit einer variablen Anzahl von Argumenten:
(defn Y [f]
((fn [x] (x x))
(fn [x]
(f (fn [& args]
(apply (x x) args))))))
nun die anonymen Funktion, die die power
Prozedur implementiert, wie in der Frage definiert. Klar, es keinen Namen hat, power
ist nur ein Parameter an die äußersten Funktion:
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1))))))
Schließlich ist hier, wie die Y-Combinator
die anonymen power
Verfahren anzuwenden, als Parameter übergeben number=5
und exponent=3
(es ist nicht tail-rekursive BTW):
((Y
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1)))))))
5 3)
> 125
Danke Jeremy, ich wusste nichts von der Namensoption. Ich arbeite durch die [4clojure] (http://www.4clojure.com/) Fragen und sie erlauben nicht defn. Schwanz Rekursion ist offensichtlich besser, aber ich möchte laufen, bevor ich renne :) –