我正在尝试编写一个函数,将0和50之间的3和5的所有倍数加起来,但是Clojure似乎决定不告诉我正确的值。(conj toSum counter)
形式应该将当前数字附加到toSum数组,并且当循环退出时,(reduce + toSum)
形式应该将数组中的所有内容加在一起。
就目前而言,当reduce
函数被调用时,toSum
始终为空,因为conj
函数没有执行应做的事情。我一定在某个地方搞砸了我的逻辑,但是我似乎无法弄清楚。
(defn calculate [target]
(loop [counter target
toSum []]
(if (= 0 counter)
(reduce + toSum)
(if (or (= 0 (mod counter 3)) (= 0 (mod counter 5)))
(do (conj toSum counter)
(println toSum)
(recur (dec counter) toSum))
(recur (dec counter) toSum)))))
最佳答案
conj
返回一个新的集合,它不会对当前的集合进行突变。您需要分配新集合,然后重复进行:
(let [nextSum (conj toSum counter)]
(println nextSum)
(recur (dec counter) nextSum))