So che in Clojure esiste il supporto sintattico per "denominare" una funzione anonima, come hanno sottolineato altre risposte. Tuttavia, voglio mostrare un approccio di primo principio per risolvere la domanda, uno che non dipende dall'esistenza di una sintassi speciale sul linguaggio di programmazione e che funzionerebbe in qualsiasi lingua con procedure di primo ordine (lambda).
In linea di principio, se si vuole fare una chiamata di funzione ricorsiva, è necessario fare riferimento al nome della funzione in modo "anonimo" (vale a dire senza nome funzioni) non possono essere utilizzate per l'esecuzione di una ricorsione ... a meno che non usi lo Y-Combinator. Here è una spiegazione di come funziona in Clojure.
Lascia che ti mostri come viene utilizzato con un esempio. In primo luogo, un Y-Combinator
che funziona per le funzioni con un numero variabile di argomenti:
(defn Y [f]
((fn [x] (x x))
(fn [x]
(f (fn [& args]
(apply (x x) args))))))
Ora, il anonima funzione che implementa la procedura power
come definito nella questione. Chiaramente, non ha un nome, power
è solamente un parametro alla funzione più esterna:
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1))))))
Infine, ecco come applicare il Y-Combinator
alla anonima power
procedura, passando come parametri number=5
e exponent=3
(non è tail-ricorsiva BTW):
((Y
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1)))))))
5 3)
> 125
fonte
2012-05-07 23:40:24
Grazie a Jeremy, non sapevo nulla dell'opzione del nome. Sto lavorando con le domande [4clojure] (http://www.4clojure.com/) e non consentono il defn. La ricorsione della coda è ovviamente migliore, ma voglio camminare prima di correre :) –