私は、Clojureには、無名関数を「命名」するための構文サポートがあることを知っています。他の答えも指摘しています。しかし、私はプログラミング言語の特別な構文の存在に依存せず、一次手続き(lambdas)を使ってどの言語でも動作する、問題を解決する第一原理アプローチを示したい。
原則として、再帰関数呼び出しを行いたい場合は、関数の名前を参照する必要があります。つまり、「匿名」(つまり、名前なし関数)は再帰を実行するために使用できません。 Y-Combinatorを使用します。 HereのClojureでの動作の説明。
例でどのように使用されているかをお見せしましょう。まず、可変数の引数を持つ関数のために働くY-Combinator
:
(defn Y [f]
((fn [x] (x x))
(fn [x]
(f (fn [& args]
(apply (x x) args))))))
さて、質問に定義されているようpower
手順を実装匿名機能。明らかに、それは名前を持っていない、power
は、最も外側の関数のパラメータのみです:
最後に
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1))))))
、ここでパラメータとして渡し、匿名power
プロシージャにY-Combinator
を適用する方法ですnumber=5
とexponent=3
(それはありません末尾再帰的BTW):
((Y
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1)))))))
5 3)
> 125
ありがとう、ジェレミー、私は名前のオプションについて知りませんでした。私は[4clojure](http://www.4clojure.com/)の質問に取り組んでおり、彼らはdefnを許可していません。テールの再帰は明らかに優れていますが、実行する前に歩きたいです。 –