【发布时间】:2016-02-22 12:12:14
【问题描述】:
我在 Clojure 文档中找不到答案。我是 Clojure 的新手,您似乎可以通过两种不同的方式使用 recur 并获得相同的结果。
示例 1:
(defn my-function [num]
(if (> num 10)
num
(recur (+ num 1))))
示例 2:
(defn my-function [num]
(loop [cnt num]
(if (> cnt 10)
cnt
(recur (+ cnt 1)))))
据我所知,这两种形式似乎做同样的事情。我知道recur 好的原因通常是在适当的情况下,编译器可以将某种伪尾调用优化组合在一起,我真的很喜欢并且希望尽可能多地使用它。所以这是我的问题:
- 如果没有
recur似乎也可以工作,那么使用loop有什么需要? -
loop是否只是创建一个类似于let创建迷你范围的“递归范围”? - 如果是这样,不使用
loop,我还能获得尾递归的好处吗?
【问题讨论】:
-
使用
loop,您可以接受(并传递)任意组参数,如果没有loop,您只能传递可以接受的函数。 -
这是有道理的。我相信可以回答问题1和2。那么第三个呢?
-
必须是尾调用,否则无法编译。
-
你的例子很可疑。您应该在两者中都有
if而不是when。我冒昧地纠正了它们(我希望!), -
@Thumbnail 感谢代码编辑。正如我所说,我是 Clojure 的新手。不过,请问您什么时候适合使用
when而不是if?
标签: recursion clojure tail-recursion tail-call-optimization