您好我一直在尝试回答一个问题,该问题涉及检查数字是否为素数。我想出了下面的代码:
isitprime :: Int->Bool
isitprime n
| n<=1 = False
| otherwise = isitprime2 n (n-1)
isitprime2 :: Int->Int->Bool
isitprime2 x y
| y > 1 && x `mod` y == 0 = False
| y == 1 && x `mod` y == 0 = True
在winhugs中运行时,对于大于2的任何值,它会返回错误“模式匹配失败:isitprime2 a a-1”。
然而,对于任何直接乘以2的值,它都会返回false,例如isitprime2 2 1返回false,isitprime2 4 2,isitprime2 6 3,isitprime2 10 5等都返回false。
出了什么问题,为什么?
谢谢:D
答案 0 :(得分:2)
函数isitprime2
的问题在于它不能处理所有情况。就像下面发生的那样:
y > 1 && x mod y != 0
y == 1 && x mod y != 0
处理其他案例,您的代码将正常运行。您还可以使用otherwise
子句来处理所有边缘情况:
isitprime2 :: Int->Int->Bool
isitprime2 x y
| y > 1 && x `mod` y == 0 = False
| y == 1 && x `mod` y == 0 = True
| otherwise = ??? -- handle all edge case