recursion - 如何在没有尾递归的情况下在匿名 fn 中进行递归

标签 recursion functional-programming clojure lisp tail-recursion

如何在不使用尾递归的情况下在匿名函数中进行递归?

例如(来自 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/recurtrampoline 明确说明。

关于recursion - 如何在没有尾递归的情况下在匿名 fn 中进行递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10490513/

相关文章:

java - 以递归方式检查初学者(不是作业,是我学习的一部分)

scala - 为什么方法参数 F 可以与类型构造函数 F 同名?

recursion - F#中的递归lambda

functional-programming - 在 elixir 中使用带有过滤器和映射的管道

clojure - 记录构造函数和位置工厂函数之间的区别

Clojure 映射到命名键语法

javascript - Array.reduce 和递归

c++ - 为什么递归可变参数模板不能按预期工作?

c++ - 这个递归函数在 C++ 中是如何运行的?

macros - Clojure 嵌套宏