我的Clojure环的尾部位置在哪里?
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放在那里 在这个表达式中,您可能根本不需要循环或重复
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组合再次编写。一般来说,除非别无选择,否则不要使用循环
——使用函数式习惯用法更优雅、更强大。