我的Clojure环的尾部位置在哪里?

我的Clojure环的尾部位置在哪里?,clojure,tail-recursion,Clojure,Tail Recursion,Clojure说我不能从非尾部位置调用recurr 这不是尾巴的位置吗 那么,我的环中的尾部位置是什么 (loop [i 20] (for [x (range 1 21)] (if (zero? (rem i x)) i (recur (+ i 1))))) for不会做你认为它会做的事;这不是一个命令循环。它是一个列表理解或序列生成器。因此,在其末尾没有返回或迭代调用,因此不能将recur放在那里 在这个表达式中,您可能根本不需要循环或重复

Clojure说我不能从非尾部位置调用
recurr

这不是尾巴的位置吗

那么,我的环中的尾部位置是什么

(loop [i 20]
    (for [x (range 1 21)]
      (if (zero? (rem i x))
        i
        (recur (+ i 1)))))

for
不会做你认为它会做的事;这不是一个命令循环。它是一个列表理解或序列生成器。因此,在其末尾没有返回或迭代调用,因此不能将
recur
放在那里

在这个表达式中,您可能根本不需要
循环
重复
;构建序列所需的就是
,但我不清楚您希望构建的序列是什么。

更进一步,任何
重复
都是指(最近的)封闭
循环
fn
(可以修饰为
letfn
defn
)。您的代码片段中没有这样的内容。因此,
重复出现
在尾部位置时没有什么可避免的

但是只要将
替换为
循环
,就可以得到

(loop [i 20]
  (loop [x 1]
    (if (zero? (rem i x))
      i
      (recur (+ i 1)))))
。。。计算结果为
20
,毫无疑问,这是您的意图

但是,外部的
循环
永远不会重复,因此很可能是
let

(let [i 20]
  (loop [x 1]
    (if (zero? (rem i x))
      i
      (recur (+ i 1)))))
recur
处于尾部位置,因为通过
loop
表单的控制路径中已无事可做:
recur
表单是返回值。
if
的两臂都有自己的尾部位置


如果
s有自己的尾部位置,还有其他一些伪装的
:或
s和
s就是这样

这是一个项目euler问题:什么是最小的正数,它可以被1到20的所有数字平均整除?来自面向对象的背景,我觉得我需要两个循环:一个循环从1到无穷大计算为I,另一个循环将I除以1到20。循环应该只在有余数时重复。在这种情况下,您尝试查找单个值,而不是序列,因此这里根本不需要
for
表达式。您可以使用
loop
,但是
reduce
更惯用。。。Clojure中几乎所有的循环都可以表示为
reduce
。但是,由于您不知道需要测试多少个,因此这里的
循环
可能更好,因为您不知道迭代的结束时间。它也不一定是无限的:20!显然是可以被所有数字1-20整除的。虽然20岁!是相当大的…我想这是练习的重点…@JacksonGariety是的,这是一种方法。完成后,要真正理解Clojure,请使用map、filter、take或drop组合再次编写。一般来说,除非别无选择,否则不要使用
循环
——使用函数式习惯用法更优雅、更强大。