【发布时间】:2018-07-29 18:48:03
【问题描述】:
我目前正在自学 Doets 和 Eijck 所著的《Haskell Road to Logic, Maths and Programming 一书,我正在阅读第 3 章。
在本章中,作者提供了实现埃拉托色尼筛法算法的Haskell代码,我不喜欢他们的实现,所以我尝试给出自己的实现;但是,我的代码版本确实只删除了 2 的倍数,我无法找出原因。代码如下:
sieve :: [Int] -> [Int]
sieve (0:xs) = sieve xs
sieve (x:xs) = x : sieve (mark x 2 xs)
where
mark :: Int -> Int -> [Int] -> [Int]
mark n k (y:ys)
| y == n*k = 0 : (mark n (k+1) ys)
| otherwise = y : (mark n (k) ys)
输出是
*Ch3> sieve [2..]
[2,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,...
那么,为什么代码没有对其他数字的倍数进行相同的删除操作,例如 3,5,7.. ?
【问题讨论】:
-
Plug for The Genuine Sieve of Eratosthenes by Melissa E. O'Neill
标签: haskell primes sieve-of-eratosthenes