【发布时间】:2010-05-15 22:09:12
【问题描述】:
我对嵌套的 doseq 循环有疑问。在 start 函数中,一旦我找到答案,我将 atom 设置为 true,这样使用 :while 的外循环验证就会失败。但是,它似乎并没有破坏它,并且循环继续进行。它有什么问题?
我也对 atom、refs、agents 的使用感到很困惑(为什么它们的更新函数名称不同,而机制几乎相同?)等。 在这种情况下可以使用原子作为标志吗?显然我需要一个类似对象的变量来存储状态。
(def pentagonal-list (map (fn [a] (/ (* a (dec (* 3 a))) 2)) (iterate inc 1)))
(def found (atom false))
(defn pentagonal? [a]
(let [y (/ (inc (Math/sqrt (inc (* 24 a)))) 6)
x (mod (* 10 y) 10)]
(if (zero? x)
true
false)))
(defn both-pent? [a b]
(let [sum (+ b a)
diff (- a b)]
(if (and (pentagonal? sum) (pentagonal? diff))
true
false)))
(defn start []
(doseq [x pentagonal-list :while (false? @found)]
(doseq [y pentagonal-list :while (<= y x)]
(if (both-pent? x y)
(do
(reset! found true)
(println (- x y)))))))
【问题讨论】:
标签: clojure