2009-10-19 37 views
7

Tương đương Clojure (đối với thuật toán chính xác) của mã Python sau đây là gì?Số nguyên tố Clojure số nguyên tố lười biếng

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 
+0

FYI thuật toán chính xác bằng Python là yếu. Hãy tìm máy phát điện nguyên tố vô hạn hiệu quả của Alex Martelli. –

+0

http://stackoverflow.com/questions/2211990/how-to-implement-an-efficient-infinite-generator-of-prime-numbers-in-python –

Trả lời

10

Đây là như Pythonish như tôi có thể làm cho nó:

(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) 

Clojure không xem xét các số nguyên từ 0 đến là boolean false. Nó đã cho tôi một vài phút để tìm ra rằng mã Python của bạn đã lợi dụng điều này.

Here là một số thuật toán số nguyên tố khác trong Clojure. Ngoài ra còn có một số thực hiện chính trong clojure.contrib.lazy-seqs.

+0

Nó không cần phải là Pitonish :) Nếu có một giải pháp clojure thành ngữ hơn cho cùng một thuật toán, hãy gửi nó đi. – Roskoto

+2

Bạn nên theo liên kết. Có rất nhiều ví dụ và câu trả lời ở đó. Ngoài ra http://clj-me.cgrand.net/2009/07/30/everybody-loves-the-sieve-of-eratosthenes/#comments. – dnolen

+1

Vâng, nó không phải là tất cả những gì không phải Clojurish khác hơn là thay đổi một nguyên tử '. Tuy nhiên, sẽ có một số mâu thuẫn để tránh sử dụng một 'nguyên tử'. Một số thuật toán yêu cầu các hiệu ứng phụ và kiểu lập trình phi chức năng (đặc biệt là các thứ như sắp xếp tại chỗ, xáo trộn, các hàm toán học cụ thể, v.v.) và chuyển sang sử dụng cấu trúc dữ liệu có thể thay đổi trong những trường hợp đó. Đó là lý do tại sao Clojure làm cho chúng có sẵn. Bạn thậm chí có thể lặn xuống và sử dụng cấu trúc dữ liệu Java nguyên gốc cho những thứ này. –

0

Phiên bản này là nhanh hơn nhiều so với @ Brian Carper của

(def prime-gen 
    (let [primes (atom [2N])] 
    (iterate 
     #(let [ps @primes] 
     (loop [n (inc %)] 
      (if (loop [i 0] 
       (let [p (nth ps i)] 
        (cond 
        (< n (* p p)) true 
        (zero? (mod n p)) false 
        :else (recur (inc i))))) 
      (do (swap! primes conj n) n) 
      (recur (inc n))))) 
     (first @primes)))) 
Các vấn đề liên quan