我在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
您,您将只能只接受函数接受的内容。这会导致堆很小的辅助功能
是的,有点
它必须是一个尾部调用,并且受编译器的约束
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句