2009-11-18 8 views
8

मैं हास्केल में Euler Problem 4 पर अपना हाथ आजमा रहा हूं। यह दो सबसे बड़ी संख्याओं को गुणा करके गठित सबसे बड़ा पालिंड्रोम मांगता है। समस्या काफी सरल थी, और मैंने सोचा कि मेरा हास्केल-फ़ू कार्य तक था, लेकिन मुझे परिणाम मिल रहा है जो कम से कम कहने के लिए असंगत दिखता है।हास्केल में यूलर समस्या - क्या कोई मेरी त्रुटि स्पॉट कर सकता है

यहाँ मेरी विलोमपद डिटेक्टर (जो कोड के लिए सादगी ही था) है:

isPalindrome :: String -> Bool 
isPalindrome [] = True 
isPalindrome str = let str2 = reverse str 
        in (str2 == str) 

यहाँ से यह है जब एक उत्पाद विलोमपद रूपों (और संभवतः एक से एक घटाना पता लगाने के लिए एक समारोह लिखने के एक साधारण सवाल मल्टीप्लिकैंड्स और ब्रूट-फोर्स सर्च पर रिकर्स अगर यह नहीं करता है)।

findPal :: Integer -> Integer -> IO() 
findPal 1 y = putStrLn "reached 1" 
findPal x y = let pal = isPalindrome $ show mult 
        mult = x * y 
        in case pal of 
          true -> putStrLn $ "mult is " ++ (show mult) 
          false -> putStrLn "pal is false" 

यहाँ GHCi में दो अलग-अलग outputs हैं:: यहाँ मेरी इस बात का बहुत सरलीकृत संस्करण, नीचे छीन और डिबगिंग के लिए एक आईओ कार्रवाई लौटने है

*Main> isPalindrome $ show (999*999) 
False 
*Main> findPal 999 999 
mult is 998001 

दूसरे शब्दों में, isPalindrome करने के लिए कॉल हमेशा होता है findPal के केस स्टेटमेंट में सत्य का मूल्यांकन करना, भले ही यह गलत होना चाहिए।

मैं यहां क्या देख रहा हूं?

+0

आप एक मत हो? – ephemient

+0

हाँ मैंने किया। मैं बस पूरी तरह से यकीन नहीं था कि इसका क्या मतलब था। पूर्वदर्शी में, यह स्पष्ट है। – rtperson

उत्तर

13

मुझे लगता है कि आपको "सत्य" और "गलत" को पूंजीकरण करने की आवश्यकता है। मैं एक Haskell दुभाषिया काम नहीं है, लेकिन आप शायद सिर्फ एक नया वेरिएबल "सच" से "दोस्त"

+0

यह काम किया। धन्यवाद! (मुझे पता था कि यह ऐसा कुछ छोटा था, लेकिन वाह, मुझे लगता है कि मेरे दिमाग में सिर्फ दो आकार घट गए ...) – rtperson

+0

मुझे केवल यह पता था क्योंकि मैंने इसे स्वयं भी किया है। ;) –

6

यह हो सकता है कि findPal में, आप True लिखना चाहिए बराबर हो और Falsetrue और false के बजाय घोषित कर रहे हैं ?

संपादित करें: ": प्रतिमान मिलान (ते) ओवरलैप हो रहे हैं चेतावनी" ठीक है, अच्छी तरह से जल्दी पक्षी यहां से पीटा ...

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