Recursion 如何调用到目前为止在lazyseq构造中生成的lazyseq?
对于我的素数lazy seq,我正在检查索引值是否可以被当前索引下的所有素数整除(Recursion 如何调用到目前为止在lazyseq构造中生成的lazyseq?,recursion,clojure,primes,lazy-evaluation,Recursion,Clojure,Primes,Lazy Evaluation,对于我的素数lazy seq,我正在检查索引值是否可以被当前索引下的所有素数整除(prime?)。问题是,当我调用自身中的素数(primesintheshr primesline)时,它只返回初始值。在懒洋洋地构建时,有可能保持懒洋洋的seq更新吗?这似乎与lazy seq的概念背道而驰 (def primes (cons 2 (for [x (range) :let [y (-> x
prime?
)。问题是,当我调用自身中的素数(primes
intheshr primes
line)时,它只返回初始值。在懒洋洋地构建时,有可能保持懒洋洋的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)))
如果您正在处理Project Euler问题,我不想破坏您的练习,但以下是如何定义斐波那契序列,以便惰性序列在运行时不断“更新”自身:
(defn fib-maker
([] (concat [0 1] (fib 0 1)))
([a b] (lazy-seq (cons b (fib b (+ a b))))))
(def fib (fib-maker))
我使用了上述方法来实现上面概述的素数序列,因此如果您需要更多详细信息,请告诉我。同时,这将有望成为一个有用的提示。我不确定您在这里要问什么,代码似乎运行正常,并且在您的算法中只有一个素数值。这就是问题所在。如果将最后一行中的输出
y
替换为primes
,则会看到primes
被固定在初始值,并且没有按原样更新。