我在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如何创建迷你范围?
  • 如果是这样,是否可以不使用ojit_code来获得尾递归的好处?
  • 最佳答案

    只是一个接一个地回答您的问题:

  • loop允许您接受并传递任意参数。没有loop,您将只能通过仅接受函数接受的功能。这会导致堆很小的辅助函数
  • 是的
  • 必须是一个尾部调用,并且受编译器
  • 的约束

    关于recursion - 循环/递归和递归本身有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33819358/

    10-12 19:04