for循环之谜(Clojure)

时间:2019-10-30 04:43:06

标签: clojure clojurescript

我是Clojure的新手,正在实现Kadane的算法。代码的质量很差,这很好,因为我想先编写不好的代码,然后逐步提高。不知何故,我的for循环未执行。请指导

我尝试过各种打印组合,但是失败了,因此我找你

(defn max-contigous-sub-array [list]
  (let [local-sum (atom (first list))
        global-sum (atom (first list))]
    (doseq [x (rest list)]
      (do
        (reset! local-sum (max x (+ @local-sum x)))
        (if (> @local-sum @global-sum)
          (reset! global-sum @local-sum))))
    @global-sum))

1 个答案:

答案 0 :(得分:4)

clojure中的for函数不是强制性循环,而是用于产生延迟生成的列表推导的函数。对于您的情况,应该使用doseq循环。

https://clojuredocs.org/clojure.core/for

https://clojuredocs.org/clojure.core/doseq

您的当前循环从未执行的原因是,您从未使用for函数返回的延迟序列执行任何操作,因此永不对seq求值。