我有一個關於嵌套循環doseq問題爆發。在啓動函數中,一旦找到答案,我將atom設置爲true,以便外部循環驗證使用:while失敗。然而,它似乎並沒有打破它,循環繼續進行。它出什麼問題了?如何從嵌套doseqs
我對原子,參考,代理的使用也很困惑(爲什麼當它們的機制幾乎相同時,它們有更新函數的不同名稱)等等。 可以使用原子嗎?這種情況作爲一個標誌?顯然我需要一個像對象一樣的變量來存儲一個狀態。
(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)))))))
謝謝。沒有意識到我可以在單劑量/每劑量下做「循環」。首先在濾波和解構五邊形列表上使用的技巧非常棒。 – fizbin 2010-05-16 07:35:58