我有一个关于嵌套doseq循环的问题.在start函数中,一旦我找到答案,我将atom设置为true,以便外部循环验证:while失败.然而,似乎它没有打破它,循环继续前进.它出什么问题了?
我也对原子,引用,代理的使用感到困惑(为什么当更新函数的机制几乎相同时它们有不同的名称?)等.在这种情况下使用原子作为标志是否可以?显然我需要一个像对象一样的变量来存储一个状态.
(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 …Run Code Online (Sandbox Code Playgroud) clojure ×1