9 Stimmen

Wie man aus verschachtelten Doseqs ausbricht

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)))))))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X