का कारण बनता है मैं क्लोजर में प्राइम संख्याओं की गणना करने के लिए एक सरल चलनी फ़ंक्शन लिखने की कोशिश कर रहा हूं। मैंने एक कुशल चलनी कार्य लिखने के बारे में this प्रश्न देखा है, लेकिन मैं अभी तक उस बिंदु पर नहीं हूं। अभी मैं बस एक बहुत ही सरल (और धीमी) चलनी लिखने की कोशिश कर रहा हूं। यहाँ मैं क्या लेकर आए हैं है:रिकर्सिव फ़ंक्शन एक स्टैक ओवरफ़्लो
(defn sieve [potentials primes]
(if-let [p (first potentials)]
(recur (filter #(not= (mod % p) 0) potentials) (conj primes p))
primes))
छोटे पर्वतमाला यह ठीक काम करता है के लिए, लेकिन बड़े श्रेणियों के लिए एक ढेर अतिप्रवाह कारण बनता है:
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)
मैंने सोचा था कि recur
का उपयोग करके यह एक गैर होगा -स्टैक उपभोग लूपिंग निर्माण? मैं क्या खो रहा हूँ?
+1 आपके प्रश्न के शीर्षक में स्टैक ओवरफ़्लो रखने के लिए – radman
मजेदार; मेरे लिये कार्य करता है। क्लोजर का कौन सा संस्करण आप किस प्लेटफॉर्म पर जेवीएम के साथ उपयोग कर रहे हैं? क्या आप ओवरफ्लो के बिना '(रेंज 2 15000) 'चला सकते हैं? –
उबंटू 9 .10, जावा 1.6.0_15, क्लोजर का नवीनतम स्नैपशॉट 1.2.0 – dbyrne