我目前正在开发一个计算友好对的程序(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,284,220]
我对 Haskell 和函数式编程还很陌生,所以如果它是一个明显的解决方案,请原谅我。