Tôi đang cố gắng viết một hàm sàng đơn giản để tính số nguyên tố trong clojure. Tôi đã nhìn thấy this câu hỏi về cách viết một chức năng sàng hiệu quả, nhưng tôi chưa đến điểm đó. Ngay bây giờ tôi chỉ đang cố viết một cái rây rất đơn giản (và chậm). Dưới đây là những gì tôi đã đưa ra:Chức năng đệ quy gây tràn ngăn xếp
(defn sieve [potentials primes]
(if-let [p (first potentials)]
(recur (filter #(not= (mod % p) 0) potentials) (conj primes p))
primes))
Đối với các khoảng nhỏ nó hoạt động tốt, nhưng gây ra một tràn ngăn xếp cho các phạm vi lớn:
user=> (sieve (range 2 30) [])
[2 3 5 7 11 13 17 19 23 29]
user=> (sieve (range 2 15000) [])
java.lang.StackOverflowError (NO_SOURCE_FILE:0)
Tôi nghĩ rằng bằng cách sử dụng recur
này sẽ là một tổ chức phi -stack-loop looping xây dựng? Tôi đang thiếu gì?
+1 vì có tràn ngăn xếp trong tiêu đề câu hỏi của bạn – radman
Vui nhộn; làm việc cho tôi. Bạn đang sử dụng phiên bản Clojure nào, với JVM, trên nền tảng nào? Bạn có thể chạy '(phạm vi 2 15000)' mà không tràn? –
Ubuntu 9.10, Java 1.6.0_15, ảnh chụp nhanh mới nhất của Clojure 1.2.0 – dbyrne