2013-10-26 9 views
5

के साथ अलग अंतःस्थापित तत्व मैंने इंटरलस्ड तत्वों को अलग करने के लिए एक फ़ंक्शन लिखा था।सिंगल लूप

interlacedElems :: [a] -> ([a], [a]) 
interlacedElems xs = (f xs, f $ tail xs) 
    where f (x:_:xs) = x : f xs 
     f x = x 

main = print $ interlacedElems "a1b2c3d4" 

आउटपुट उत्पादित:

("abcd","1234") 

मेरी कोड में मैं f को परिभाषित करने और इसे दो बार उपयोग करते हैं, प्रभावी रूप से एक ही सूची के माध्यम से दो बार, लेकिन थोड़ा अलग ढंग से हर बार recursing।

मेरा प्रश्न है: क्या ऐसा कोई तरीका है जिसे मैं लिख सकता हूं, इसलिए मैं केवल एक बार सूची के माध्यम से पुन: कार्य करता हूं? क्योंकि यह अधिक कुशल होगा, क्या आपको लगता है कि डॉग नहीं है?

मैंने इसे अपने कुछ दिमाग से बाहर निकालने की कोशिश की और फिर मेरी माँ ने मुझे बताया क्योंकि वह कहती है कि मुझे हमेशा जगह पर मस्तिष्क का रस मिल रहा है और गुलाबी दाग ​​से बाहर होने में उम्र लगती है कालीन।

धन्यवाद अच्छा लोगों :)

+0

बस इसे संबोधित करना चाहते हैं: "क्योंकि यह अधिक कुशल होगा, आपको नहीं लगता?"। मेरा अनुमान है कि "शायद नहीं, वास्तव में" - लेकिन आपको निश्चित रूप से मापना चाहिए यदि यह आपके लिए महत्वपूर्ण है! [मानदंड] देखें (http://hackage.haskell.org/package/criterion) या ऐसा कुछ। –

उत्तर

2

मैं सिर्फ एक समारोह है कि रिकर्सिवली tuples में एक सूची विभाजन लिखते थे और उसके बाद का उपयोग unzip:

listToTuples :: [a] -> [(a, a)] 
listToTuples (x:y:xs) = (x, y) : listToTuples xs 
listToTuples _ = [] 

interlacedElems :: [a] -> ([a], [a]) 
interlacedElems = unzip . listToTuples 
+0

दोनों 'unzip' और स्पष्ट रूप से रिकर्सिव एल्गोरिदम ~ n/2 चरण लेते हैं, इसलिए मुझे लगता है कि यह ओपी के अनुरोध को अधिक कुशल तरीके से मेल खाता है। एकमात्र संभावित मुद्दा यह है कि, यदि मूल सूची में तत्वों की एक विषम संख्या है, तो अंतिम तत्व को त्याग दिया जाता है। – duplode

+0

@ डुप्लोड मैंने इसे माना, लेकिन मुझे उस समस्या को हल करने के अलावा कोई समस्या नहीं है, ('([(ए, ए)], शायद ए) ', जो कि वास्तव में इसके लायक होने के लिए बहुत अजीब है उस अंतिम तत्व की आवश्यकता है। – bheklilr

9

आप भी इसे foldr इस चाल का उपयोग कर जरिए कर सकते हैं:

interlacedElems :: [a] -> ([a], [a]) 
interlacedElems = foldr (\x ~(l,r) -> (x:r,l)) ([],[]) 

नोट

अचूक पैटर्न ~(l,r) यह अनंत सूचियों पर काम करता है।

+0

साफ। एकमात्र चेतावनी यह है कि, यदि यह महत्वपूर्ण है कि मूल सूची के पहले तत्व के साथ कौन सा उपन्यास समाप्त होता है, तो हमें उपन्यासियों को टैग करने की आवश्यकता होती है। – duplode

+1

@ डुप्लोड यह आसानी से साबित होता है कि पहला तत्व हमेशा जोड़ी में पहली सूची में समाप्त होगा। वास्तव में – is7s

+0

। क्षमा करें, वह मूर्खतापूर्ण गलती थी। – duplode

संबंधित मुद्दे