【发布时间】:2018-12-14 18:47:08
【问题描述】:
为了练习,我编写了一个 Haskell 程序来查找素因数。
代码如下:
getfactors :: Int -> [Int]
getfactors n = [x | x<-[1..n], n `mod` x == 0]
prime :: Int -> Bool
prime n | getfactors n == [1,n] = True
| otherwise = False
primefactors :: Int -> [Int]
primefactors n = [x | x <- getfactors n, prime x == True]
对于小数来说一切正常,但是当我输入大数时,计算会在最大的素数处停止,并且预期的列表不会关闭。 例如:
>primefactors 1263
[3,421]
>primefactors 1387781234
[2,7,2161,6553
非常感谢您的解释。
【问题讨论】:
-
我认为这只是您使用的一种非常慢的算法。计算似乎并没有真正停止。如果我用
-O2编译它并尝试从main打印你的第二个示例,它(完全)在几秒钟内完成。它在6553之后检查更多的数字,因为1387781234比6553大很多。由于它执行此操作相当缓慢且6553是最后一个主要因素,因此它会在打印最终括号之前出现在最后一个因素上停止的外观(即使它正在继续并且如果您允许它完成则应该停止)。 -
getfactors可以改进为 O(sqrt(n)),这将有很大帮助。提示:因子成对出现。 -
这不仅慢,而且我怀疑它是错误的。
primefactors 4计算[2],我希望[2,2]。 -
@franky 代码按预期工作,因为我只想获得不同的主要因素。
-
规范的审判部门定义为
primeFactors;在 SO 上的许多答案中也可以看到。你可以用map head . group“唯一化”它。
标签: haskell list-comprehension