2011-10-27 15 views
5

में जीसीएफ/एलसीएम मैं हास्केल के लिए बेहद नया हूं।हास्केल

क्या हैस्केल में GCF या एलसीएम (कम आम एकाधिक) खोजने का कोई आसान तरीका है?

उत्तर

7

मुझे यकीन नहीं है कि एलसीएफ क्या है लेकिन जीसीएफ एक हास्केल पसंदीदा है। यूक्लिडियन एल्ग्राइथ्म का उपयोग करके आप वास्तव में समझ सकते हैं कि हास्केल कैसे काम करता है। http://en.wikipedia.org/wiki/Euclidean_algorithmhttp://en.literateprograms.org/Euclidean_algorithm_(Haskell) पर एल्गोरिदम कैसे स्थापित किया गया है, इस बारे में एक महान स्पष्टीकरण है।

हास्केल में इस प्रकार का रिकर्सन आम है और यह दिखाता है कि भाषा कितनी अभिव्यक्तिपूर्ण हो सकती है।

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

यह तर्कों पर मेल खाने वाले पैटर्न का उपयोग करता है कि किसी भी संख्या का सबसे बड़ा आम कारक और 0 पहला नंबर है। यदि संख्याएं शून्य दोनों हैं, तो दूसरे के सबसे बड़े आम कारक और दूसरे के पहले मोड की तलाश करें। आखिरकार यह दूसरे तर्क में 0 तक पहुंच जाएगा। यह पहला पैटर्न ट्रिगर करेगा और पहला तर्क लौटाएगा जो उत्तर है।

[संपादित करें]

समारोह वास्तव में होना चाहिए:

gcd a 0 = a 
gcd a b = b `seq` gcd b (a `mod` b) where 

यह पिछले प्रत्यावर्तन कदम की (एक mod ख) के मूल्यांकन के लिए बाध्य करेगा और एक विशाल thunk पाएगा स्मृति में बनाया जा रहा है, तो , कहें, आप जीसीडीिंग 1243235452 और 6095689787662 हैं। सेक ने अपने "कमजोर हेड सामान्य फॉर्म" में तर्क को बल दिया है या तर्क की बाहरी सबसे अधिक डेटा संरचना का मूल्यांकन किया है।

+0

शायद यहाँ एक 'seq' में जोड़ना चाहिए कर सकता है। – alternative

+0

बिल्कुल। हालांकि ओपी हास्केल के लिए नया है, लेकिन यह सीखने के लिए अच्छा समय है। –

+0

ओपी शायद यह जानता है, लेकिन 'lcm ab = let g = gcd ab in (div ag) * b' –

12

जीसीएफ द्वारा, क्या आपका मतलब सबसे बड़ा आम कारक, या सबसे बड़ा आम विभाजक है? यह gcd है, जो प्रीलूड से उपलब्ध है, जैसा lcm है, कम से कम आम एकाधिक।

3

gcd प्रस्ताव में आयात किया गया है। इसका मतलब यह है कि जब भी आप कुछ भी नहीं चाहते हैं तो आप इसे इस्तेमाल कर सकते हैं। यदि आप स्वयं को लागू करने में रुचि रखते हैं तो एरिक हिनटन यूक्लिडियन एल्गोरिदम का एक साधारण संस्करण दिखाता है। हालांकि एक बात: / केवल फ्लोटिंग पॉइंट डिवीजन के लिए उपयोग की जाती है, div और mod का उपयोग करने के लिए जब आप "पूर्णांक विभाजन" करना चाहते हैं तो शेष और शेष ढूंढने के लिए उपयोग करें। प्रस्तावना कम से कम सामान्य एकाधिक के लिए lcm फ़ंक्शन को भी परिभाषित करता है।

0

या आप भी

euclid(n,m) = 
    if n == m then n 
    else if n < m then euclid(n, m-n) 
    else euclid(n-m, m)