【问题标题】:Sieve of Eratosthenes infinite list埃拉托色尼筛无限列表
【发布时间】:2016-01-13 15:40:08
【问题描述】:

您好,我必须为 Eratosthenes 的筛子实现一个功能。

我已经有函数了

removep p l

删除l 中匹配谓词p 和函数的元素

nats

返回一个无限的自然数列表,我应该在我的解决方案中同时使用这两个。

现在,我确实了解筛子本身的工作原理,但似乎我在实施时遇到了问题。

我正在做这样的事情:

sieve = (drop 1 nats)
 where
   sieve (h:t) = h : (removep (\x -> (mod x p) == 0) t) : sieve

但这似乎不起作用。有什么帮助吗? 另请注意,这是一项任务,因此如果可能,请不要提供确切的解决方案。我宁愿了解我做错了什么以及我需要如何改变它。提前致谢。

【问题讨论】:

  • 令人耳目一新地看到有人只是在寻求正确的方向,而不是让其他人来做所有的工作。

标签: haskell recursion sieve-of-eratosthenes


【解决方案1】:

您的代码中有一些错误:

  1. 您想定义一个应该是素数列表的sieve 列表,但在where 中您阴影 名称sieve 带有一个函数。在这个定义中,你使用sieve 作为一个列表,但这里它实际上引用了函数,因此你会得到一个类型错误。

    您想对drop 1 nats 应用一个函数以获取素数列表。

  2. mod x p 中应该是mod x h,因为h 是您正在考虑的主要因素。

  3. 您正在定义sieve (h:t) = h:removep ... :_ 但在这里您要创建一个列表,其中第一个元素是h,一个数字,第二个元素是removep ...,这是一个列表,然后其余元素是由sieve 拍摄(如前所述,这是不正确的。

  4. 吹毛求疵:从技术上讲,这不是埃拉托色尼的筛子,因为在筛子的算法中,您从不实际上使用mod 来检查可分性。

【讨论】:

  • 感谢您的积分。关于(2),它是一个错字。我们的想法是应用 removep 和参数 (\x -> (mod x h) == 0) t 以便删除列表头部可整除的任何内容。
【解决方案2】:

基本思想是你得到nats的列表作为筛子的起点。然后,您将带有谓词的 removep 函数递归地应用于除第一个元素之外的所有元素。

你很接近,但我认为你的问题在于符号(见 Bakuriu 的回答) 我不会给你答案,但我会给你一个提示:

sieve = s (drop 1 nats)
  where
    -- Recursive definition of s here
    -- s (h:t) = ???

我希望我没有放弃太多让它变得微不足道。祝你好运。

PS:正如 Bakuriu 所说,这真的不是一个真正的筛子。有关此事的更多信息,请查看here

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多