如何在不使用尾递归的情况下在匿名函数中进行递归?
例如(来自 Vanderhart 2010,第 38 页):
(defn power
[number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1)))))
假设我想以匿名函数的形式执行此操作。出于某种原因,我不想使用尾递归。我该怎么做?例如:
( (fn [number exponent] ......))))) 5 3)
125
我可以为此使用 loop 吗?或者 loop 只能与 recur 一起使用吗?
最佳答案
fn
特殊形式给你 option to provide a name可以在内部用于递归。
(doc fn)
;=> (fn name? [params*] exprs*)
因此,添加“power”作为名称来完成您的示例。
(fn power [n e]
(if (zero? e)
1
(* n (power n (dec e)))))
即使递归发生在尾部位置,也不会优化替换当前栈帧。 Clojure 强制您使用 loop
/recur
和 trampoline
明确说明。
关于recursion - 如何在没有尾递归的情况下在匿名 fn 中进行递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10490513/