2024 Clojure状态调查!分享您的想法。

欢迎!请查看关于页面,获取有关如何使用此页面的更多信息。

0
序列

你好,我是Clojure和惰性序列的新手。

(defn get-biggest-prime-factor [num]
  (let [max-check (inc (Math/sqrt num))
        lazy-primes (filter-lazy-seq is_prime naturals)]
    (loop [prime (first lazy-primes)
           max-factor 1]
      (cond (>= prime max-check) max-factor
            (= 0 (rem num prime)) (recur (first (rest lazy-primes)) (first lazy-primes))
            :else (recur (first (rest lazy-primes)) max-factor)))) )
  • naturals 是一个由1,2,3 ... 构成的无限惰性序列,
  • filter-lazy-seq 是一个函数,它返回一个由第二个参数推导出的懒序列。序列的每个元素都会通过第一个参数进行验证,该参数是一个谓词
  • is_prime 是一个检查数字是否是素数的函数

任何帮助都将受到欢迎。

你能提供完整的代码吗?

编辑
当然,

(defn is_prime [num]
  (letfn [(helper [i]
            (cond
              (> i (Math/sqrt num)) true
              (= 0 (rem num i)) false
              :else (recur (inc i))))]
    (helper 2)))

返回一个懒序列,序列的每个后续元素都通过谓词进行过滤
(defn filter-lazy-seq [predicate sequence]
  (如果 sequence 为 nil,则返回 nil
        (断言 (sequence 的第一个元素)
        (将 sequence 的第一个元素与经过断言的序列连接起来
             (余下的 sequence 继续传递给断言函数,直到 sequence 继续运行,展示所有断言语句)
        :else (继续传递 sequence 给断言函数并继续运行余下的 sequence)

(定义函数 natural-gen []
  (定义内嵌函数 (helper [n]
            (将 n 与递归调用 helper2 的结果连接起来)
    (从 1 开始调用 helper 函数)
  )

(将 natural-gen 函数的返回结果定义为对象)

1 个答案

+1

被选中
 
最佳答案

我怀疑你的问题是你在“保留头部”-- 你的函数将 lazy-primes 绑定到序列,然后你遍历序列,所以你仍然保留对整个序列的引用,如果你请求的 num 足够大,你将超出堆,因为你的函数需要整个序列来工作。

所以,即使我请求数值较小(即(get-biggest-prime-factor 6)),评估也会一直继续,直到内存溢出。我已经在问题的评论部分提供了其余的代码。
现在我已经看到了所有代码,并在REPL中尝试了它,我可以看到问题所在。

在`get-biggest-prime-factor`函数中,你在递归时传入`(first (rest lazy-primes))`,但`lazy-primes`在循环中不会改变,所以你总是传入2,它会反复检查相同的值。

此外,在一次递归调用中,你将`(first lazy-primes)`作为`max-factor`传入--这同样永远不会改变。
非常感谢!!!
...