对Haskell中一系列函数的优化

时间:2009-10-11 06:27:45

标签: haskell math optimization

我正在尝试在项目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的优化解决方案。

1 个答案:

答案 0 :(得分:2)

内存问题可能在于decToList或fac。

我用

运行它
fac = product . enumFromTo 1
decToList = map (read . return) . show
main = print answer

但它并没有接近我的所有内存,但它没有完成。

顺便说一句:我怀疑一个先进的项目欧拉问题要比那更难。因此这个算法不会这样做。