我想仅使用列表理解方法和/或Haskell中的.
(函数组合运算符)找到给定数字的所有素数。我特别想避免递归解决方案。
例如,pfactors 120
必须产生[2,2,2,3,5]
输出。
我试过了:
pfactors n = [p | p <- [2..n], n `mod` p == 0, [d | d <- [1..p], p `mod` d == 0] == [1,p]]
但是,当我调用
pfactors 120
时,结果是[2,3,5]
,不是所有主要因素。 最佳答案
这是我的处理方式:
pfactors :: Integer -> [Integer]
pfactors n = [ p
| p <- [2..n] -- Possible factors
, [d | d <- [1..p], p `mod` d == 0] == [1,p] -- Are prime
, _ <- [ p | i <- [1..n], n `mod` p^i == 0] ] -- Divisible powers
从本质上讲,这是您所拥有的解决方案,但是不同之处在于,它在末尾具有额外的列表理解,其中包含与
p
中的n
个因素一样多的元素。免责声明实际上,我真的不会这样做。
编辑我写上面的东西感觉很脏,所以作为参考,这与我要写的内容更接近:
pfactors' :: Int -> [Int]
pfactors' = unfoldr firstFactor
where
firstFactor n =
listToMaybe [(f, n `div` f)
| f <- [2..n]
, n `mod` f == 0]
依存关系:
Data.List (unfoldr)
,Data.Maybe (listToMaybe)