में ढेर और कचरे के बारे में शुरुआती प्रश्न मेरे पास क्लोजर: के बारे में एक प्रश्न है, मैं Project Euler से जाकर भाषा सीखने की कोशिश कर रहा हूं और मुझे समझ में नहीं आता कि हुड के नीचे क्या चल रहा है: निम्न कोड को डिज़ाइन किया गया है lim
तक सभी प्राइम संख्याओं की एक सूची लौटाएं। मुझे लगता है कि यह हेप-स्पेस में ओ (एन) होना चाहिए क्योंकि मैं lim
तक सभी संख्याओं की एक सूची बना देता हूं, और फिर पहली बार एक नई सूची में स्थानांतरित करते समय उन्हें एक-एक करके फ़िल्टर करता हूं। (मुझे पता है कि मैं वास्तव में प्रत्येक पुनरावृत्ति होना नई सूची बनाने रहा हूं, लेकिन मुझे नहीं लगता था कि वे अधिक स्मृति ले जाएगा?) वैसे भी मैंक्लोजर
(defn getAllPrimes [lim]
(defn getPrimes [primes numlist]
(if (not-empty numlist) ;base case;
(recur (cons (first numlist) primes) ;put the prime on to the prime list
(filter
(fn [x] (not (div? x (first numlist)))) ;remove the prime and all its multiples from the numlist
(rest numlist)))
primes)); return the primes
(getPrimes() (range 2 lim))) ;call the recursive function with and empty prime list to be filled up and a full numlist to be emptied
के साथ इस चला रहा हूँ और मैं ढेर में स्थान कम है, जब मैं फोन रखने के
(apply + (getAllPrimes 2000000))
, लेकिन मैं
(apply + (filter even? (range 2000000)))
पर स्थान शेष नहीं नहीं है तो मुझे लगता है कि मुझे समझ में नहीं चाहिए कि कैसे सूचियों कचरा कॉल में एकत्र कर रहे पुनरावृत्ति होना है और वास्तव में हे उपयोग कर रहा हूँ (एन * एन) ढेर या कुछ।
यह पहले से यहां उत्तर है: संक्षिप्त जवाब यह है कि फ़िल्टर आलसी अनुक्रम बनाता है और आप फिल्टर पर फ़िल्टर को कॉल कर रहे हैं ... और आखिरकार ओवरफ्लो ढेर करते हैं। इसे हल करने का एक तरीका (जैसा कि ड्रेश द्वारा सुझाया गया है) को 'डोल' द्वारा हर कदम अनुक्रम का एहसास करना है। –