【发布时间】:2016-11-10 19:52:15
【问题描述】:
我正在处理 clojure 中的递归,我不太明白。 我做了一个取自here 的小程序,它试图找到可以除以1 到20 的所有数字的小数。这是我写的代码,但一定有一些东西我丢失了,因为它不起作用。 你能帮我一把吗?谢谢!
(defn smallest [nume index]
(while(not ( = index 0))
(do
(cond
(zero?(mod nume index))(let [dec' index] (smallest nume index))
:else (let [inc' nume] (smallest nume index))))))
编辑:
看起来更好loop/recur 所以我试了一下:
(loop [nume 20
index 20]
(if (= index 0)
(println nume)
(if (zero?(mod nume index))
(recur nume (dec index))
(recur (inc nume) 20)))))
工作。如果你对结果感到好奇--> 232792560
【问题讨论】:
-
投资于理解循环/递归、不变性和标准库序列转换函数 -
while是一种命令式循环结构,根据我的经验,每年使用的次数不会超过一次或两次。 -
看来您是在黑暗中拍摄。例如,您认为
(index 20)会做什么?此外,在recur中,值的顺序很重要,我不确定您是否按照自己的想法行事。 -
我刚刚编辑了关于订单的问题。我对
(index 20)的意思是再次将索引设置为20。 @shlomi -
@Capie,所以这不是它在做什么。事实上,它会抛出一个错误,因为
index不是一个函数,而你正试图将20 应用于函数index。如果你想保持index为 20,你应该简单地做(recur (inc nume) 20)。此评论也适用于(nume),您正在尝试调用该号码:)。我更新了我的答案,看看这是否有帮助。 -
@shlomi 帮了大忙。它的工作。谢谢老兄。