我尝试了哈斯克尔对哥德巴赫的猜想。这是99个问题#40。 我复制粘贴,然后我得错了结果。我在哪里修理?你能告诉我吗? 1不是素数。
Expect:
goldbach 14
(3,11)
or
(7,7)
Got:
goldbach 14
(1,13)
问题:
http://www.haskell.org/haskellwiki/99_questions/31_to_41#Problem_40
解决方案:
http://www.haskell.org/haskellwiki/99_questions/Solutions/40
我的代码: 编辑2012-04-02 13:29 JST, isPrime 1 = False
I got:
goldbach 14
(3,11)
But I got:
goldbach 4
Exception: Prelude.head: empty list
Expected:
goldbach 4
(2,2)
https://gist.github.com/2233519
goldbach a = head $
filter (\(x,y) -> isPrime x && isPrime y) $
map (\e -> (e, a - e)) [1,3..a `div` 2]
where
factors a = filter (isFactor a) [2..a-1]
isFactor a b = a `mod` b == 0
isPrime 1 = False
isPrime a = null $ factors a
答案 0 :(得分:1)
更改
[1,3..a `div` 2]
要
[3,5..a `div` 2]
我希望这有道理?即使您从1
函数中排除factors
,您仍然会将其作为一对传递到map
函数中。因此,使用isPrime
调用1
。让我们看看它是如何发挥作用的:
isPrime 1 = null $ factors 1
和
factors 1 = filter (isFactor a) [] -- [2..1] == []
所以
null (factors 1)
所以
isPrime 1