में रिकूर का उपयोग करते समय ओवरफ़्लो मेरे पास क्लोजर (एक अक्षम एल्गोरिदम) में एक साधारण प्राइम नंबर कैलकुलेटर है, लेकिन मैं अभी रिकर के व्यवहार को समझने की कोशिश कर रहा हूं)। कोड है:क्लोजर
(defn divisible [x,y] (= 0 (mod x y)))
(defn naive-primes [primes candidates]
(if (seq candidates)
(recur (conj primes (first candidates))
(remove (fn [x] (divisible x (first candidates))) candidates))
primes)
)
यह तब तक काम करता है जब तक मैं बहुत अधिक संख्याओं को खोजने की कोशिश नहीं कर रहा हूं। उदाहरण के लिए
(print (sort (naive-primes [] (range 2 2000))))
काम करता है। अधिक रिकर्सन की आवश्यकता के लिए, मुझे एक अतिप्रवाह त्रुटि मिलती है।
(print (sort (naive-primes [] (range 2 20000))))
काम नहीं करेगा। आम तौर पर, क्या मैं टीसीओ के प्रयास के बिना दोबारा रिकूर या कॉल बेवकूफ-प्राइम का उपयोग करता हूं, कोई फर्क नहीं पड़ता है। रिकूर का उपयोग करते समय मुझे बड़ी रिकर्सन के लिए त्रुटियां क्यों मिल रही हैं?
क्या पुनरावृत्ति को पूंछ रिकर्सन प्राप्त करने के लिए लूप की आवश्यकता होती है? मुझे आपके कोड में लूप नहीं दिख रहा है। मैं इसे एक उत्तर दूंगा, लेकिन मैं अभी भी क्लोजर सीख रहा हूं। – octopusgrabbus
क्लोजर 1.2.1 और 1.3 में आपका कोड मेरे लिए काम करता है। 200,000 तक प्राइम ढूंढते समय मुझे एकमात्र त्रुटि मिलती है जिसे 'आउटऑफमेमरी एरर' मिलता है। –
@ ऑक्टोपसग्राबस, नहीं, पुनरावृत्ति का उपयोग इस फैशन में किया जा सकता है (बस एक फ़ंक्शन बॉडी के भीतर)। Http://clojure.org/special_forms#recur देखें। –