【问题标题】:How to call the lazy-seq made so far within construction of a lazy-seq?到目前为止,如何在惰性序列的构造中调用惰性序列?
【发布时间】:2011-09-14 01:15:37
【问题描述】:

对于我的素数惰性序列,我正在检查索引值是否可以被当前索引以下的所有素数整除 (prime?)。问题是,当我在自身内部调用素数(shr-primes 行内的primes)时,它只返回初始值。是否可以在惰性构建时保持惰性序列更新?这似乎与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)))

【问题讨论】:

  • 我不确定你在这里问什么,代码似乎可以运行,并且你的算法中只有一个质数值。
  • 这就是问题所在。如果您将最后一行中的输出y 替换为primes,那么您将看到primes 停留在初始值并且没有按应有的方式更新。

标签: recursion clojure primes lazy-evaluation


【解决方案1】:

如果你正在做 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))

我已使用上述方法来实现您在上面概述的素数序列,所以如果您想了解更多详细信息,请告诉我。同时,希望这将是一个有用的提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 2016-09-19
    • 2011-09-15
    • 2019-09-16
    • 2014-06-23
    • 1970-01-01
    • 2012-03-01
    • 2011-07-21
    相关资源
    最近更新 更多