중첩 된 doseq 루프에 관한 질문이 있습니다. 시작 함수에서 일단 내가 답을 찾으면 원자를 true로 설정하여 while 루프를 사용하여 외부 루프 유효성 검사를 수행합니다. 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)))))))
감사합니다. 내가 하나의 doseq/for에서 "루핑"을 할 수 있다는 것을 깨닫지 못했다. 필터링되고 소멸 된 펜타그램리스트에서 처음으로 사용하는 트릭은 훌륭합니다. – fizbin