我正在尝试在项目euler中执行问题254并在Haskell中找到这组函数和重构:
f n = sum $ map fac (decToList n)
sf n = sum $ decToList (f n)
g i = head [ n | n <- [1..], sf n == i]
sg i = sum $ decToList (g i)
answer = sum [ sg i | i <- [1 .. 150] ]
其中:
f (n)
查找n
sf (n)
是f (n)
g (i)
是sf (i)
的最小整数解。因为sf (i)
sg (i)
是g (i)
但是不久就运行了这个脚本的编译版本,它吸收了我所有的RAM。有没有更好的方法来实现函数g (i)
?如果是这样,它们会是什么,我怎么能去做呢?
编辑:
出于清晰度,我的职能是:
fac
是:
`fac 0 = 1`
`fac n = n * fac (n-1)`
decToList
将数字放入列表中:
decToList1 x = reverse $ decToList' x
where
decToList' 0 = []
decToList' y = let (a,b) = quotRem y 10 in [b] ++ decToList' a
虽然我已经将它们更新为Yairchu的优化解决方案。
答案 0 :(得分:2)
内存问题可能在于decToList或fac。
我用
运行它fac = product . enumFromTo 1
decToList = map (read . return) . show
main = print answer
但它并没有接近我的所有内存,但它没有完成。
顺便说一句:我怀疑一个先进的项目欧拉问题要比那更难。因此这个算法不会这样做。