Ich habe eine Frage zu verschachtelten doseq-Schleifen. Sobald ich in der Startfunktion eine Antwort gefunden habe, setze ich das Atom auf true, so dass die Validierung der äußeren Schleife mit :while fehlschlägt. Es scheint jedoch, dass dies die Schleife nicht unterbricht, und die Schleifen laufen weiter. Was ist daran falsch?
Ich bin auch ziemlich verwirrt über die Verwendung von Atomen, Refs, Agenten (warum haben sie unterschiedliche Namen für die Aktualisierungsfunktionen, wenn der Mechanismus fast derselbe ist?) usw. Ist es in Ordnung, ein Atom in dieser Situation als Flag zu verwenden? Offensichtlich brauche ich eine Variable wie ein Objekt, um einen Zustand zu speichern.
(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)))))))