Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个clojure素数序列有什么问题?_Clojure_Lazy Sequences - Fatal编程技术网

这个clojure素数序列有什么问题?

这个clojure素数序列有什么问题?,clojure,lazy-sequences,Clojure,Lazy Sequences,我不明白为什么惰性素数序列的定义会导致非终止。我得到的堆栈跟踪没有多大帮助。我对clojure的一个抱怨是堆栈跟踪迟钝 (declare naturals is-prime? primes) (defn naturals ([] (naturals 1)) ([n] (lazy-seq (cons n (naturals (inc n)))))) (defn is-prime? [n] (not-any? #(zero? (rem n %)) (t

我不明白为什么惰性素数序列的定义会导致非终止。我得到的堆栈跟踪没有多大帮助。我对clojure的一个抱怨是堆栈跟踪迟钝

(declare naturals is-prime? primes)

(defn naturals
  ([] (naturals 1))
  ([n] (lazy-seq (cons n (naturals (inc n))))))

(defn is-prime? [n]
  (not-any? #(zero? (rem n %))
                (take-while #(> n (* % %)) (primes))))

(defn primes
  ([] (lazy-seq (cons 2 (primes 3))))
  ([n] (let [m (first (filter is-prime? (naturals n)))]
         (lazy-seq (cons m (primes (+ 2 m)))))))

(take 10 (primes)) ; this results in a stack overflow error

问题是,要知道如何计算素数函数,您使用的是素数?函数,然后计算出是素数?函数使用素数,因此堆栈溢出

所以要计算素数3,你需要计算第一个滤波器是素数?naturals 3,哪个叫做prime?1,它调用素数,它依次调用素数3。换句话说,你正在做:

user=> (declare a b)
#'user/b
user=> (defn a [] (b))
#'user/a
user=> (defn b [] (a))
#'user/b
user=> (a)
StackOverflowError   user/b (NO_SOURCE_FILE:1)

要了解如何生成素数:

问题是要知道如何计算使用的素数函数是素数?函数,然后计算出是素数?函数使用素数,因此堆栈溢出

所以要计算素数3,你需要计算第一个滤波器是素数?naturals 3,哪个叫做prime?1,它调用素数,它依次调用素数3。换句话说,你正在做:

user=> (declare a b)
#'user/b
user=> (defn a [] (b))
#'user/a
user=> (defn b [] (a))
#'user/b
user=> (a)
StackOverflowError   user/b (NO_SOURCE_FILE:1)
要了解如何生成素数:

让我们开始执行素数,我们将神奇地实现一个seq,只是为了弄清楚。我将忽略naturals,因为它确实是懒惰的:

 > (magically-realise-seq (primes))
=> (magically-realise-seq (lazy-seq (cons 2 (primes 3))))
=> (cons 2 (primes 3))
=> (cons 2 (let [m (first (filter is-prime? (naturals 3)))]
             (lazy-seq (cons m (primes (+ 2 3))))))
=> (cons 2 (let [m (first (filter
                            (fn [n]
                              (not-any? #(zero? (rem n %))
                                            (take-while #(> n (* % %)) (primes))))) 
                            (naturals 3)))]
             (lazy-seq (cons m (primes (+ 2 3))))))
我已经替换了素数?在最后的fn中,你可以看到素数将再次被调用,并且至少在take while拉出元素时实现一次。这将导致循环。

让我们开始执行素数,然后我们将神奇地实现一个序列,只是为了弄清楚。我将忽略naturals,因为它确实是懒惰的:

 > (magically-realise-seq (primes))
=> (magically-realise-seq (lazy-seq (cons 2 (primes 3))))
=> (cons 2 (primes 3))
=> (cons 2 (let [m (first (filter is-prime? (naturals 3)))]
             (lazy-seq (cons m (primes (+ 2 3))))))
=> (cons 2 (let [m (first (filter
                            (fn [n]
                              (not-any? #(zero? (rem n %))
                                            (take-while #(> n (* % %)) (primes))))) 
                            (naturals 3)))]
             (lazy-seq (cons m (primes (+ 2 3))))))

我已经替换了素数?在最后的fn中,你可以看到素数将再次被调用,并且至少在take while拉出元素时实现一次。这将导致循环。

我认为问题在于,您试图在构造素数之前使用素数

改变是最好的?这样就解决了问题:

(defn is-prime? [n]
     (not-any? #(zero? (rem n %))
               (take-while #(>= n (* % %)) (next (naturals)))))

注意,我已经用>=更改了>,否则它会给出4是素数。它仍然说1是prime,这是不正确的,如果使用is prime,可能会导致问题?其他地方。

我认为问题在于,在构造素数之前,您试图使用素数

改变是最好的?这样就解决了问题:

(defn is-prime? [n]
     (not-any? #(zero? (rem n %))
               (take-while #(>= n (* % %)) (next (naturals)))))
注意,我已经用>=更改了>,否则它会给出4是素数。它仍然说1是prime,这是不正确的,如果使用is prime,可能会导致问题?其他地方