2016-12-04 39 views
1

你好,我想作区间[4..n]功能goldbach :: Integer -> Bool应该返回True仅在该区间的所有元素均匀,可以从两个一本正经的数字来概括。到目前为止,我已经做到了。哥德巴赫功能偶数[4..n]名单

goldbach::Integer->Bool 
goldbach n 
    |goldbach2 n == ??? = goldbach (n-2) 
    |n==4 = True 
    |otherwise = False 

goldbach2 :: Integer -> (Integer, Integer) 
goldbach2 a = head $ 
       filter (\(x,y) -> isPrime x && isPrime y) $ 
       map (\e -> (e, a - e)) [3,5..a `div` 2] 
where 
factors a = filter (isFactor a) [2..a-1] 
isFactor a b = a `mod` b == 0 
isPrime a = null $ factors a 

功能golbach2结果看起来像这样goldbac2 28 = (5, 23)。如果goldbach2 n的结果是正确的,并且给我两个纯数字,我应该如何在我的第三行goldbach2 n == ??? = goldbach (n-2)中行动?

+0

你的描述必须是错误的,因为,只有符合条件的区间是[]和' [4..4]'因为所有其他人至少有一个奇数。因此,你所描述的简短版本是'g =(<= 4)' – Ingo

+0

我不知道它怎么可能。如果我输入'n = 8',我应该有一个列表'[4,6,8]',它应该返回True。 –

+1

是的,你实际上并没有在你的代码中构造区间'[4..n]'。在描述中,你真正的意思是'[4,6..n]' – Ingo

回答

1

如果我理解正确的话,你想要的东西,如:

| let (n1, n2) = goldbach2 n in n == n1 + n2 = goldbach (n-2) 
+0

是的,我认为那是我需要的,但是能否告诉我该如何使用它,我不能只是简单地用您的第三条线代替我,还是我可以? –

+0

我想你可以,虽然我没有测试过它。 let ... in条款是条件,单个“=”是该条件的值。哦,我忘了领先的“|”。我会编辑它。 –

+0

是的,但问题是我得到一个错误,该goldbatch得到几个参数 –

0

我会写这就像

goldbachInterval n = all goldbach [4,6 .. n] 
    where 
     goldbach k = .... -- property of being a golbach number