Clojure素数懒惰序列

Ros*_*oto 8 python clojure

以下Python代码的Clojure等价物(对于精确算法)是什么?

from itertools import count
from math import sqrt

def prime_gen():
   primes = []
   for n in count(2):
       if all(n%p for p in primes if p <= sqrt(n)):
           primes.append(n)
           yield n
Run Code Online (Sandbox Code Playgroud)

Bri*_*per 11

这是我所能做的Pythonish:

(def prime-gen
     (let [primes (atom [])]
       (for [n (iterate inc 2)
             :when (not-any? #(zero? (rem n %))
                             (filter #(<= % (Math/sqrt n)) 
                                     @primes))]
         (do (swap! primes conj n)
             n))))

(take 10 prime-gen)  ; => (2 3 5 7 11 13 17 19 23 29)
Run Code Online (Sandbox Code Playgroud)

Clojure不认为整数0是布尔值false.我花了几分钟才发现你的Python代码正在利用这一点.

以下是Clojure中的一些其他素数算法.还有一个素数实现clojure.contrib.lazy-seqs.

  • 你应该点击链接.那里有很多例子和答案.还有http://clj-me.cgrand.net/2009/07/30/everybody-loves-the-sieve-of-eratosthenes/#comments. (2认同)