【发布时间】:2013-02-05 08:43:41
【问题描述】:
过去几天我一直在通过 Learn You A Haskell 学习 Haskell。我一直在尝试完成一些 Project Euler 问题,其中一些需要素数。但是,我编写的尝试生成一些函数(在本例中为低于 20000 的素数)的函数输出不正确。当我运行它时,GHCi 返回 '[1, ' 并且似乎没有终止。我使用的代码是:
sieve :: (Integral a) => a -> [a] -> [a]
sieve 20000 list = list
sieve n (x:xs) = sieve (n+1) $ x:(filter (\q -> q `mod` n /= 0) xs)
primesto20000 = sieve 2 [1..20000]
然后我打电话给primesto20000。我知道该功能可能效率低下,我主要是就我必须犯的语法/过程错误寻求帮助。
谢谢
【问题讨论】:
-
我不知道为什么这个函数似乎没有终止,但我明白为什么它只输出 1,是不是因为你过滤掉了素数及其导数?
-
我打算在过滤函数之前使用 x: 附加素数(即列表中的第一个数字),该函数仅作用于列表的其余部分 xs。我该怎么做? @KimitsuDesu
-
附带说明,这不是筛子。它只是一个试用除法素数生成器。
-
顺便说一句,如果您以后关心性能,您可能需要检查this great article。你用的算法比试除法差。