哥德巴赫在哈斯克尔的猜想(99题#40)

时间:2012-03-29 05:18:36

标签: haskell

我尝试了哈斯克尔对哥德巴赫的猜想。这是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

1 个答案:

答案 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