簡體   English   中英

我在哪里失去懶惰?

[英]Where am I losing lazyness?

我正在嘗試編寫一個懶惰的迭代主篩。

篩網的每次迭代都用

[[primes] (candidates) {priority-map-of-multiples-of-primes}]

我有一個函數,篩選下一個候選更新,快樂地進行篩選迭代,檢查下一個候選者,並適當地更新所有三個組件。

像這樣使用:

(take 3 (iterate sieve-next-candidate-update [[2] (range 3 13 2) (priority-map 2 2)]))

我得到了我期望的結果:

([[2] (3 5 7 9 11) {2 2}]
 [[2 3] (5 7 9 11) {3 3, 2 4}]
 [[2 3 5] (7 9 11) {5 5, 2 6, 3 6}])

但是,當我通過reduce運行它來刪除沒有找到新素數的迭代時,它會嘗試處理整個序列,但是我定義了初始候選列表(如果我使用迭代,則表觀無限循環)。

(take 3 
   (reduce (fn [old-primes-sieves new-sieve]
             (prn (str "reduce fn called with new sieve" new-sieve))
             (if (= (last (first (last old-primes-sieves))) ; I'm aware I don't want last in the final version
                    (last (first new-sieve)))
               old-primes-sieves
               (conj old-primes-sieves new-sieve)))
           []
           (iterate sieve-next-candidate-update [[2] (range 3 13 2) (priority-map 2 2)])))

輸出

"reduce fn called with new sieve[[2] (3 5 7 9 11) {2 2}]"
"reduce fn called with new sieve[[2 3] (5 7 9 11) {3 3, 2 4}]"
"reduce fn called with new sieve[[2 3 5] (7 9 11) {5 5, 2 6, 3 6}]"
"reduce fn called with new sieve[[2 3 5 7] (9 11) {7 7, 2 8, 3 9, 5 10}]"
"reduce fn called with new sieve[[2 3 5 7] (11) {3 9, 2 10, 5 10, 7 14}]"
"reduce fn called with new sieve[[2 3 5 7 11] nil {11 11, 2 12, 3 12, 7 14, 5 15}]"

然后在這種有限的情況下拋出NullPointerException。

我在哪里失去懶惰?

reduce不是懶惰的 - 它將嘗試迭代整個無限序列(iterate sieve-next-candidate-update [[2] (range 3 13 2) (priority-map 2 2)]) 您可以改用縮減

順便說一句,有效的無限素數序列的好例子可以在clojure.contrib中 找到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM