到目前为止,如何调用lazy-seq构建一个lazy-seq?

时间:2011-06-13 16:07:40

标签: recursion clojure primes lazy-evaluation

对于我的素数lazy seq,我正在检查索引值是否可以被当前索引(prime?)下面的所有素数整除。问题是,当我在其自身内调用素数(primes行内shr-primes)时,它只返回初始值。是否可以在懒惰地构建它时保持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)))

1 个答案:

答案 0 :(得分:2)

如果你正在处理Project Euler问题,我不想破坏你的练习,但是这里你将如何定义一个斐波那契序列,以便lazy-seq保持“更新”它自己:< / p>

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

(def fib (fib-maker))

我已经使用上述方法来实现您在上面概述的素数序列,因此如果您想了解更多详细信息,请告知我们。同时,这有望成为一个有用的暗示。