Eratosthenes筛选无限列表

时间:2016-01-13 15:40:09

标签: haskell recursion sieve-of-eratosthenes

你好我必须实现一个筛选Eratosthenes的功能。

我已经有了一个功能

removep p l

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

nats

返回自然数字的无限列表,我应该在我的解决方案中使用两者。

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

我正在做这样的事情:

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

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

2 个答案:

答案 0 :(得分:3)

您的代码中存在一些错误:

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

    您希望将函数应用于drop 1 nats以获取素数列表。

  2. mod x p mod x h,它应该是h,因为sieve (h:t) = h:removep ... :_是您正在考虑的主要内容。

  3. 您正在定义h但是在这里您要创建一个列表,其中第一个元素是removep ...,一个数字,第二个元素是sieve,这是一个列表,然后剩余的元素由mod获取(这已经说错了。

  4. 挑剔:从技术上讲,这不是eratosthenes的筛子,因为在筛子的算法中,你从不实际使用<form action="action" method="get"> <input type="hidden" name="test" value="test" /> <ul> <li><input id="checkbox" type="checkbox" name="forest_type" value="forest_1"><label for="checkbox_forest" data-forest="Estern forest">Forest 1</label></li> </ul> <button type="submit">Submit</button> </form> 来检查是否可分。

答案 1 :(得分:1)

基本的想法是,您将ul {text-align-justify} 列表作为筛子的起点。然后,您将带有谓词的nats函数递归应用于除第一个元素之外的所有元素。

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

removep

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

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