如何解决在 Haskell
我有这个函数,它接受一个整数 n 并返回一个类型为 Maybe Int 的列表,其中包含唯一的素数因子。我不明白为什么它在列表的每个元素中以 Just 返回它们。
我期待这样的输出:
primeFactors 75 = Just [3,5]
但我有一个看起来像这样:
primeFactor 75 = [Just 5,Just 3,Just 1]
这是我的代码:
divides :: Int -> Int -> Bool
divides m n = rem m n == 0
transform :: Int -> Int
transform n = (n*2) + 1
isComposite :: Int -> Bool
isComposite n = foldl (||) (divides n 2) (map (divides n) (map (transform) [1..(div n 4)]))
isPrime :: Int -> Bool
isPrime n
| n <= 0 = error "Makes no sense"
| n < 4 = True
| otherwise = not (isComposite n)
primeFactors :: Int -> [Maybe Int]
primeFactors 0 = [Nothing]
primeFactors n = primeFactors2 n ((div n 2)+1)
primeFactors2 :: Int -> Int -> [Maybe Int]
primeFactors2 n 0 = []
primeFactors2 n x
| divides n x && isPrime x = Just x:primeFactors2 n (x-1)
| otherwise = primeFactors2 n (x-1)
解决方法
这是我认为可以满足您要求的代码版本:
primeFactors :: Int -> Maybe [Int]
primeFactors n
| n <= 0 = Nothing
| otherwise = Just $ primeFactors2 n n
primeFactors2 :: Int -> Int -> [Int]
primeFactors2 n p
| n <= 1 || p <= 1 = []
| divides n p && isPrime p = p : primeFactors2 (n `div` p) p
| otherwise = primeFactors2 n (p-1)
isPrime :: Int -> Bool
isPrime n
| n <= 1 = False
| otherwise = not (isComposite n)
isComposite :: Int -> Bool
isComposite n =
any (divides n) [2..n-1]
divides :: Int -> Int -> Bool
divides m n =
rem m n == 0
请注意(为了清楚起见,我希望)我确实删除了您的一些优化并进行了重大更改:这个将报告 Just [2,2]
作为 4
的主要因素
(IMO 你想要 product <$> primeFactors n == Just n
)。
如果不是(如您的示例所示),解决此问题应该不会太难(只需使用您的版本即可)。
无论如何,唯一真正有趣的贡献是 primeFactor
如何处理 primeFactors2
以获得 Maybe
结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。