2015-01-16 8 views
5

की आवश्यकता है जब तक कि मैं अंतिम कार्य पर स्टम्प्ड नहीं करता तब तक मेरा होमवर्क वास्तव में अच्छा चला गया।
पहले, मैं एक कस्टम List संरचना को परिभाषित करने के लिए किया था:कस्टम 'फोल्ड' फ़ंक्शन को काउंटर

foldList :: (a -> b -> b) -> b -> List a -> b 
foldList f b Nil  = b 
foldList f b (Cons a l) = f a (foldList f b l) 

दूसरा पैरामीटर मान कि अंत में इस्तेमाल किया जाता है:

data List a = Nil | Cons a (List a) deriving Show 

एक अन्य कार्य के लिए एक कस्टम fold समारोह लिखने के लिए था सूची में (Nil तत्व पर)।

prodList :: List Int -> Int 
prodList = foldList (\x y -> x * y) 1 

1 अंत में multplication की तटस्थ तत्व है:

मैं भी एक समारोह prodList कि एक दूसरे के साथ प्रदान की गई सूची के प्रत्येक तत्व गुणा लिखना पड़ा। इसलिए गणना पर इसका कोई असर नहीं पड़ता है।

पिछले एक है, हालांकि, मुझे हल करने के लिए के लिए मुश्किल है।
मुझे एक फ़ंक्शन binList लिखना है जो एक बाइनरी संख्या का प्रतिनिधित्व करने वाली सूची के दशमलव मान की गणना करता है। कम से कम महत्वपूर्ण बिट सूची का पहला तत्व है, इसलिए बाइनरी संख्या को उलट दिया जाता है।
एक दिया गया उदाहरण यह है कि binList (Cons 1 (Cons 0 (Cons 0 (Cons 0 (Cons 1 Nil))))) का परिणाम 1 9 होना चाहिए (क्योंकि (10001) _2 है (1 9) _10)। सूची का परिणाम [1,1,0,1], हालांकि, (1011) _2 = (11) _10 होना चाहिए)।
असाइनमेंट की दोषी है कि हम foldList उपयोग करने के लिए है, है।

मैं कैसे प्रत्येक अंक की गणना करने के पता है, लेकिन मैं पता लगाने के लिए जो सूचकांक i मैं वर्तमान में कर रहा हूँ एक रास्ता खोजने के लिए संघर्ष:

binList :: List Int -> Int 
binList = foldList (\x y -> 2^i*x + y) 

संभवतः में इस समस्या के समाधान के लिए एक अच्छा, करी तरीका है हास्केल। क्या आप मुझे समझा सकते हैं कि आप इस असाइनमेंट को कैसे हल करेंगे?

+3

आप को पता है कि सूचकांक आप पर हैं की जरूरत नहीं है। (संकेत: यदि आपके पास 10 अंक हैं, तो सबसे महत्वपूर्ण जरूरतों को 2, 9 गुणा से गुणा किया जाना चाहिए ... सूची में इसके दाईं ओर अंकों की संख्या .. हम्म ....) – alternative

+0

फ़ंक्शन लागू किया गया है प्रति तत्व आधार पर। प्रत्येक सूची के तत्वों के लिए एक्सपोनेंट 'i' बदलता है। मुझे पता नहीं है कि एक्सपोनेंट को निर्धारित करने के लिए इंडेक्स को जानने के बिना ऐसा करना संभव है। – J0hj0h

+0

ओ.ओ यह इतना आसान है! संकेत के लिए धन्यवाद! पूरी तरह से इसे करने का तरीका भूल गया! : डी – J0hj0h

उत्तर

6

आप गणना को लिखने के लिए थे, तो यह इस प्रकार दिखाई देगा:

x0 + 2 * x1 + 4 * x2 + 8 * x3 + ... 

यह सुझाव है कि शायद आप सूचकांक उपयोग करने की आवश्यकता है, लेकिन अगर आप इस अभिव्यक्ति गुणनखंड, तो आप इस बजाय:

x0 + 2 * (x1 + 2 * (x2 + 2 * (x3 ... 

आप देखते हैं कि कैसे यह अब एक गुना के रूप में लिखा जा सकता है है? सूचना एक स्व-समानता है कि इस तरह तरह का लग रहा है नहीं है:

x + 2 * x' 

उम्मीद है कि यह है कि आप के लिए एक संकेत के लिए पर्याप्त है :)

+0

हाँ, बहुत बहुत धन्यवाद[email protected] पहले से ही इस संकेत दिया है और मैंने अभी कोड लिखा है। यह काम! कभी-कभी मैं पेड़ों के लिए लकड़ी नहीं देखता हूं। : डी – J0hj0h

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