他の回答が指摘しているように、Clojureには匿名関数の「命名」に対する構文サポートがあることを私は知っています。ただし、この問題を解決するための第一原理アプローチを示したいと思います。これは、プログラミング言語の特殊な構文の存在に依存せず、一次手続き (ラムダ) を使用する任意の言語で機能するものです。
原則として、再帰関数呼び出しを行う場合は、関数の名前を参照する必要があるため、「匿名」(つまり、名前のない関数) を使用して再帰を実行することはできません ... Y-Combinatorを使用しない限り. これがClojureでどのように機能するかの説明です。
例を挙げて使い方を説明します。まず、Y-Combinator
可変数の引数を持つ関数で機能する a :
(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))))))
最後に、Y-Combinator
を匿名power
プロシージャに適用し、パラメーターとして渡す方法を次に示します(末尾再帰ではありません) number=5
。exponent=3
((Y
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1)))))))
5 3)
> 125