【问题标题】:Goldbach function for list of even numbers [4..n]偶数列表的哥德巴赫函数 [4..n]
【发布时间】:2016-12-04 10:32:41
【问题描述】:

您好,我正在尝试为区间 [4..n] 创建一个函数 goldbach :: Integer -> Bool,仅当该区间中的所有元素都是偶数并且可以从两个 prim 数字求和时,它才应该返回 True。到目前为止,我已经做到了。

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)

【问题讨论】:

  • 您的描述一定是错误的,因为,唯一的限定区间是 [] 和 [4..4],因为在所有其他区间中至少有一个奇数。因此,您所描述的简短版本是g = (<=4)
  • 我不明白这怎么可能。如果我输入 n=8 我应该有一个列表 [4,6,8] 它应该返回 True。
  • 是的,您实际上并没有在代码中构造区间 [4..n]。在描述中,你真正的意思是[4,6 .. n]
  • 那么我应该如何更改它以使其正确?

标签: haskell primes


【解决方案1】:

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

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

【讨论】:

  • 是的,我认为这是我需要的东西,但你能告诉我应该如何使用它吗?我不能简单地用你的第三行替换我的第三行,或者我可以吗?
  • 我想你可以,虽然我没有测试过。 let ... in 子句是条件,单个“=”是该条件的值。哦,我忘记了开头的“|”。我将在其中进行编辑。
  • 是的,但问题是我遇到了一个错误,即 goldbatch 的参数很少
  • 是的,没关系,在goldbatch2之后只需要n
【解决方案2】:

我会这样写

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多