我知道在 Clojure 中有对“命名”匿名函数的语法支持,正如其他答案所指出的那样。但是,我想展示一种解决问题的第一性原理方法,这种方法不依赖于编程语言中特殊语法的存在,并且适用于任何具有一阶过程 (lambdas) 的语言。
原则上,如果要进行递归函数调用,则需要引用函数的名称,因此“匿名”(即无名函数)不能用于执行递归......除非您使用Y-Combinator . 下面解释了它在 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))))))
最后,这里是如何将 应用于Y-Combinator
匿名power
过程,作为参数传递number=5
并且exponent=3
(它不是尾递归 BTW):
((Y
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1)))))))
5 3)
> 125