recur
只能返回到最新的“递归点”(无论是 loop
还是 fn
),这使得没有“外部帮助”,例如 trampoline,互递归将不可能。这更像是一种临时解决方案,但问题太大了,需要一个恰当的解决方案需要太多。这可以通过视觉检查代码轻松确定。在计算机科学中,尾调用是作为过程最后一项操作执行的子例程调用。
(defn x [] (x)) ; <- StackOverflowError if called
(defn x [] (recur)) ; <- hangs if called
但如果您想要强制执行这一点并在失败时中止,您必须进行以下操作之一:
后者似乎更实用,特别是对于纯函数。
我没有找到任何现有的解决方案来实现这一点。
funt(n)
,那么这就是一个尾调用;但如果是 1 + funct(n)
,那么它将无法进行尾调用优化。 - DavidC