我在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
通常是好的原因是,在正确的情况下,编译器可以破解某种伪尾部调用优化程序,我真的很喜欢并希望尽可能多地使用它。所以这是我的问题:loop
似乎可以使用recur
,则需要使用loop
吗? let
是否仅创建“递归范围”,就像loop
如何创建迷你范围? 最佳答案
只是一个接一个地回答您的问题:
loop
允许您接受并传递任意参数。没有loop
,您将只能通过仅接受函数接受的功能。这会导致堆很小的辅助函数关于recursion - 循环/递归和递归本身有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33819358/