2012-06-07 4 views
5
में एक अनंत सूची को फ़िल्टर करने

मैं निम्नलिखित कोड है कि एरेटोस्थेनेज की चलनी लागू करता है:हास्केल

primes :: [Int] 
primes = primes' [2..] 

primes' :: [Int] -> [Int] 
primes' [] = [] 
primes' (p:ps) = p:(primes' [p' | p' <- ps, not (p' `isMultiple` p)]) 

a `isMultiple` b = (a `mod` b) == 0 

main = print (sum (primes' [2..100000])) 

मैं की तरह

main = print (sum [p | p <- primes, p < 100000])) 

कुछ करने के लिए मुख्य परिवर्तन करना चाहते हैं नहीं आश्चर्यजनक रूप से, इस वजह से लटकी हुई है यह अनंत सूची प्राइम्स के हर तत्व के खिलाफ पी की तुलना करनी चाहिए। चूंकि मुझे पता है कि प्राइम्स बढ़ते क्रम में है, जैसे ही मुझे एक ऐसी तत्व मिलती है जो मेरी ऊपरी सीमा से अधिक हो, अनंत सूची को कैसे छोटा कर सकता हूं?

पेज। सिद्धांत रूप में, primes 'primes की एक सूची वापस करने के लिए इनपुट सूची फ़िल्टर। मुझे पता है कि अगर मैं 2 से कम किसी अन्य चीज़ पर सूची शुरू करता हूं तो कुछ समस्याएं होंगी। मैं अभी भी इस मुद्दे को अपने आप को हल करने के तरीके पर काम कर रहा हूं, इसलिए कृपया कोई spoilers नहीं। धन्यवाद ;-)

+5

वैसे, यह Erastosthenes की असली चलनी नहीं है। [यह कूल आलेख] देखें (www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf) बाहर। – hugomg

+0

लेख के लिए धन्यवाद। मैंने अभी तक इसे पढ़ना समाप्त नहीं किया है, लेकिन अब तक यह दिलचस्प लग रहा है। –

उत्तर

18

इस तरह के मामलों जहाँ आप जानते हैं कि एक बार विधेय एक तत्व के लिए झूठी देता है, यह कभी सच एक बाद तत्व के लिए नहीं लौटेगा में, आप filtertakeWhile साथ की जगह ले सकता है, जो तत्व के रूप में जल्द ही ले जा रहा बंद हो जाता है क्योंकि भविष्यवाणी पहली बार झूठी वापसी करती है।

+0

धन्यवाद। मुझे इस पर गौर करना होगा। –