gpt4 book ai didi

functional-programming - 依赖于先前元素的惰性序列

转载 作者:行者123 更新时间:2023-12-04 08:40:35 24 4
gpt4 key购买 nike

学习clojure,试图创建一个所有质数的惰性无限序列。
我知道有更有效的算法;我将以下内容更多地作为 POC/类(class)而不是作为理想的解决方案。

我有一个函数,给定一个素数序列,它告诉我下一个素数是什么:

(next-prime [2 3 5]) ; result: 7

因此,我的惰性序列必须将自身传递给该函数,然后获取结果并将其添加到自身中。

我的第一次尝试:
(def lazy-primes
(lazy-cat [2 3 5] (find-next-prime lazy-primes)))

..这会导致 IllegalArgumentException:不知道如何从以下位置创建 ISeq:java.lang.Integer

我的第二次尝试:
(def lazy-primes
(lazy-cat [2 3 5] [(find-next-prime lazy-primes)]))

..当被要求提供 10 个元素时,它给了我 [2 3 5 7]。

尝试 3:
(def lazy-primes
(lazy-cat [2 3 5]
(conj lazy-primes (find-next-prime lazy-primes))))

(take 10 lazy-primes) ; result: (2 3 5 7 2 3 5 7 2 3)

所有这些似乎都应该起作用(或者至少应该起作用,因为前面的不起作用)。为什么我会得到每个案例的虚假输出?

最佳答案

您最初的尝试不起作用的原因:

  • (find-next-prime lazy-primes) 返回一个整数但lazy-cat 需要一个序列
  • [(find-next-prime lazy-primes)] 创建一个向量(因此是 seqable)但它只在第一次访问时被评估一次
  • conj 正在向序列的开头添加新的质数(因为lazy-cat 并且因此lazy-primes 返回一个序列)...这可能不是您想要的!根据它的实现方式,它也可能会混淆 find-next-prime,并且在分块序列周围也可能存在一些微妙的问题......

  • 你可能想要使用类似的东西:
    (defn seq-fn [builder-fn num ss] 
    (cons
    (builder-fn (take num ss))
    (lazy-seq (seq-fn builder-fn (inc num) ss))))

    (def lazy-primes
    (lazy-cat [2 3 5] (seq-fn next-prime 3 lazy-primes)))

    有点复杂,但基本上我正在做的是使用高阶辅助函数为一组参数提供闭包,其中包括迄今为止创建的素数的数量,以便它可以在每一步增量生成下一个素数.

    附言我相信你知道有更快的算法来生成素数!我假设这主要是作为 Clojure 中的练习和惰性序列的使用,在这种情况下一切都很好!但是,如果您真的很在意生成大量质数,我建议您查看 Sieve of Atkin

    关于functional-programming - 依赖于先前元素的惰性序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955251/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com