如何解决从[1 ..]图中排除计算结果?
| 我目前正在开发一个计算友好对的程序(Project Euler Problem 21)。我已经找到了解决方案,但是我注意到程序中的一个缺陷是它会评估集合[1 ..]的所有数字,而不管我们是否已经发现该数字是一对。 即,如果发现当前正在评估220和284是它的对,但是当map函数达到284时继续进行下去,则不应再次对其进行评估。import Data.List
properDivisors :: (Integral a) => a -> [a]
properDivisors n = [x | x <- [1..n `div` 2],n `mod` x == 0 ]
amicablePairOf :: (Integral a) => a -> Maybe a
amicablePairOf a
| a == b = Nothing
| a == dOf b = Just b
| otherwise = Nothing
where dOf x = sum (properDivisors x)
b = dOf a
getAmicablePair :: (Integral a) => a -> [a]
getAmicablePair a = case amicablePairOf a of
Just b -> [a,b]
Nothing -> []
amicables = foldr (++) [] ams
where ams = map getAmicablePair [1..]
举个例子:
take 4 amicables
返回:
[220,284,220]
我对Haskell和函数式编程相当陌生,因此如果它是一个显而易见的解决方案,请原谅我。
解决方法
您的问题是,您尝试通过输出两个友好号码来确保工作安全。但是实际上,您不是很安全,因为您的函数仍会为两个数字计算它们是否友好。为什么不这样做:
import Data.List
divSum :: (Integral a) => a -> [a]
divSum n = sum (filter (\\a -> a `mod` n == 0) [1..n `div` 2])
isAmicable :: (Integral a) => a -> Bool
isAmicable a = a /= b && a == c where
b = divSum a
c = divSum b
amicables = filter isAmicable [1..]
, 也许对ѭ4稍加修改会有所帮助?
getAmicablePair :: (Integral a) => a -> [a]
getAmicablePair a = case amicablePairOf a of
Just b -> if a < b then [a,b] else []
Nothing -> []
...所以您得到的第一个元素较小的对
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。