当前位置: 首页 > 知识库问答 >
问题:

惰性序列与无限序列的堆栈溢出

仇承志
2023-03-14
(defn primes-gen [sieve]
  (if-not (empty? sieve)
    (let [prime (first sieve)]
      (cons prime
            (lazy-seq (primes-gen
                       (filter (fn [x]
                                 (not= 0 (mod x prime)))
                               (rest sieve))))))))

;;;;; --------- TO SHOW ABOUT THE LAZY-THINGS 
;; (take 400 (primes-gen (iterate inc 2)))
;; (take 400 (primes-gen (range 2 1000000000000N)))
user> (pst)
StackOverflowError 

    clojure.core/range/fn--4269 (core.clj:2664)
    clojure.lang.LazySeq.sval (LazySeq.java:42)
    clojure.lang.LazySeq.seq (LazySeq.java:60)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core/seq (core.clj:133)
    clojure.core/filter/fn--4226 (core.clj:2523)
    clojure.lang.LazySeq.sval (LazySeq.java:42)
    clojure.lang.LazySeq.seq (LazySeq.java:60)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core/seq (core.clj:133)

做这件事的正确方法是什么?

共有1个答案

公孙国兴
2023-03-14

您的分析是正确的:您嵌套过滤器太多了。您应该修改prime-gen以获得两个arg:已知素数和候选素数的集合。关于实现eRathostenes筛网的一些其他想法,请参见我的博客。

Update:因此,您将筛选器堆叠在筛选器之上,在某个时候,当您想要获取新的候选项时,堆叠太大了。

您必须将所有筛选器合并为一个(或合理数量的)传递。这里很容易,因为过滤器是非常均匀的。因此,我将过滤器堆栈替换为一个包含已知素数的集合。

(defn primes-gen
 ([candidates] (primes-gen candidates []))
 ([candidates known-primes]
  (lazy-seq ; I prefer having the lazy-seq up here
    (when-first [prime candidates] ; little known macro
      (let [known-primes (conj known-primes prime)]
        (cons prime
          (primes-gen
            (drop-while (fn [n] (some #(zero? (mod n %)) known-primes)) candidates)
             known-primes)))))))
 类似资料:
  • 我写了以下内容: 解决4clojure.com的问题#118:http://www.4clojure.com/problem/118 当我询问时,不出所料,我会得到一个clojure.lang.lazyseq,但我不知道这与简单地删除lazy-seq“包装”有什么区别。 当然,现在如果删除lazy-seq,我会得到一个stackoverflow,为什么要执行这个: 否则(也就是说:如果我让lazy

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:

  • HLOJ 9525,习题3-5 栈序列匹配 题目描述 对于给出的入栈序列和出栈序列,判断这两个序列是否相容,即能否利用栈操作将入栈序列转换为出栈序列。若相容,则输出yes,否则输出no。要求在判断栈序列的匹配过程中,给出入栈、出栈的过程。 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入用一个空格分隔的两个字符串(两个串的长度可能不一样,长度均不超过10),

  • 我基于Maged M.Michael和Michael L.Scott的《简单、快速、实用的非阻塞和阻塞并发队列算法》中指定的算法实现了一个无锁队列(有关算法,请跳到第4页) 我在上使用了原子操作,如等。 当只在一个线程中使用队列时,一切都很好,但是当从不同的线程中使用它时,我会得到堆栈溢出异常。 不幸的是,我无法追查问题的根源。似乎当一个<code>shared_ptr</code>超出范围时,它

  • 下面是一个重现我的问题的示例项目:https://github.com/deathcoder/hazelcast-shared-session

  • 我知道对无限列表进行排序是不可能的,但我正试图为n个数的倍数的无限递增列表写一个定义。 我已经有这个功能了 它返回n的无限倍数列表。但现在我想构建一个函数,给定一个返回列表中所有数字的倍数的无限递增列表。所以函数