Ich versuche meine Hand bei Euler Problem 4 in Haskell. Es fragt nach dem größten Palindrom, das durch Multiplikation zweier dreistelliger Zahlen entsteht. Das Problem war einfach genug, und ich dachte, dass mein Haskell-fu der Aufgabe gewachsen war, aber ich bekomme ein Ergebnis, das, um es milde auszudrücken, uneinheitlich aussieht.Euler-Problem in Haskell - Kann jemand meinen Fehler finden
Hier ist mein Palindrom Detektor (die Einfachheit selbst Code war):
isPalindrome :: String -> Bool
isPalindrome [] = True
isPalindrome str = let str2 = reverse str
in (str2 == str)
Von hier aus ist es eine einfache Frage eine Funktion des Schreibens zu erkennen, wenn ein Produkt mit einem Palindrom bildet (und möglicherweise einen von einem subtrahieren der Multiplikanden und recurse über eine Brute-Force-Suche, wenn dies nicht der Fall ist). Hier ist meine sehr vereinfachte Version davon, abgespeckte und Zurücksenden eine IO Aktion für die Fehlersuche:
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"
Hier sind zwei separate Ausgänge in GHCi:
*Main> isPalindrome $ show (999*999)
False
*Main> findPal 999 999
mult is 998001
Mit anderen Worten, ist der Aufruf von isPalindrome immer in findPal's case-Anweisung zu true auswerten, auch wenn es falsch sein sollte.
Was sehe ich hier nicht?
Haben Sie keine bekommen? – ephemient
Ja, tat ich. Ich war mir nicht ganz sicher, was es bedeutete. Im Nachhinein ist es offensichtlich. – rtperson