2011-06-13 75 views
3

對於我的素數懶惰seq,我檢查是否索引值可以被當前索引(prime?)以下的所有素數整除。問題是,當我自己調用素數時(primesshr-primes行內),它只返回初始值。是否有可能在延遲構建時更新lazy-seq?懶惰seq概念似乎是反直覺的。如何調用lazy-seq構造中的lazy-seq?

(def primes 
    (cons 2 (for [x   (range) 
        :let [y      (-> x (* 2) (+ 3)) 
         root     (math/floor (math/sqrt y)) 
         shr-primes  (take-while (partial >= root) primes) ;; primes stuck at init value 
         prime?    (every? #(not= % 0) (pmap #(rem y %) shr-primes))] 
        :when prime?] 
       y))) 
+0

我不確定你在問什麼,代碼似乎起作用,並且算法中只有一個素數值。 – 2011-06-13 16:51:56

+0

這就是問題所在。如果用'primes'替換最後一行中的輸出'y',那麼你會看到'primes'被卡住了初始值,並沒有像原來那樣更新。 – 2011-06-13 18:35:57

回答

2

如果你正在做的項目歐拉問題,我不想破壞鍛鍊你的,但這裏的,這樣的懶-seq的不斷「更新」自己,你會如何定義斐波納契數列有云:

(defn fib-maker 
    ([] (concat [0 1] (fib 0 1))) 
    ([a b] (lazy-seq (cons b (fib b (+ a b)))))) 

(def fib (fib-maker)) 

我用上面的方法來實現你上面已經概述的素數序列,因此,如果您想了解更多的細節讓我知道。同時,這將有助於提示。