Haskell 程序检查回文
本教程将帮助我们使用 haskell 中的用户定义函数和布尔函数检查任何数字是否为回文数。回文数是当其数字反转时保持不变的数字。以下示例将让您清楚地了解回文数。
例如,121、12321 和 1221 是回文数,而 123、1234 和 1212 不是。
算法
步骤 1 - 使用反向函数的 isPalindrome 函数定义为, isPalindrome str = str == reverse str。
步骤 2 - 程序执行将从主函数开始。 main() 函数对程序有完全的控制权。它写为 main = do。在主函数中,传递一个字符串,然后将其传递给 isPalindrome 函数。该函数的结果用于打印一条消息,指示该字符串是否为回文。
步骤 3 - 初始化名为"str"的变量。它将保存要检查是否为回文数的字符串。
步骤 4 - 调用函数后,使用"putStrLn"语句将结果打印到控制台。
示例 1
在此示例中,isPalindrome 函数将字符串作为输入,如果字符串是回文(即正向和反向阅读时相同),则返回 True,否则返回 False。函数使用reverse函数将输入的字符串反转,并与原字符串进行比较,如果相等,则该字符串为回文,否则不是。
isPalindrome :: String -> Bool isPalindrome str = str == reverse str main :: IO () main = do let str = "1331" if isPalindrome str then putStrLn "The string is a palindrome." else putStrLn "The string is not a palindrome."
输出
The string is a palindrome.
示例 2
在此示例中,isPalindrome 函数检查输入字符串是否为空或由单个字符组成,在这种情况下,它返回 True,因为根据定义,此类字符串是回文。如果输入字符串较长,它会检查第一个字符和最后一个字符是否相等,如果相等,它会对字符串的其余部分(不包括第一个字符和最后一个字符)递归调用 isPalindrome。如果这两个条件都满足,则输入字符串是回文,函数返回 True。否则,它返回 False。
isPalindrome :: String -> Bool isPalindrome [] = True isPalindrome [_] = True isPalindrome (x:xs) = (x == last xs) && isPalindrome (init xs) main :: IO () main = do let str = "1331" if isPalindrome str then putStrLn "The string is a palindrome." else putStrLn "The string is not a palindrome."
输出
The string is a palindrome.
示例 3
在此示例中,isPalindrome 函数使用列表推导式从输入字符串的开头和结尾创建对应字符对的列表。然后使用 all 函数检查所有这些对是否相等。如果所有对都相等,则输入字符串为回文,函数返回 True。否则,返回 False。
isPalindrome :: String -> Bool isPalindrome str = all (\(x,y) -> x == y) [(str !! i, str !! (len-i-1)) | i <- [0..(len `div` 2)]] where len = length str main :: IO () main = do let str = "1331" if isPalindrome str then putStrLn "The string is a palindrome." else putStrLn "The string is not a palindrome."
输出
The string is a palindrome.
结论
在 Haskell 中,我们可以使用带有反向函数、列表推导或递归的用户定义函数来检查数字是否为回文。