私は現在、友好的なペアを計算するプログラムに取り組んでいます (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と関数型プログラミングにかなり慣れていないので、明らかな解決策であれば許してください。