for循环之谜(Clojure)
Mystery of for loop (Clojure)
我是 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))
clojure 中的 for
函数不是命令式循环,而是用于生成延迟生成的列表理解的函数。对于您的情况,您应该使用 doseq
循环。
https://clojuredocs.org/clojure.core/for
https://clojuredocs.org/clojure.core/doseq
您当前的循环从未被执行的原因是因为您从未对 for
函数返回的惰性序列执行任何操作,因此从不评估惰性序列。
我是 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))
clojure 中的 for
函数不是命令式循环,而是用于生成延迟生成的列表理解的函数。对于您的情况,您应该使用 doseq
循环。
https://clojuredocs.org/clojure.core/for
https://clojuredocs.org/clojure.core/doseq
您当前的循环从未被执行的原因是因为您从未对 for
函数返回的惰性序列执行任何操作,因此从不评估惰性序列。