我正在尝试编写一个函数,将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))

09-15 17:14