我试图在Project 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)
但是在运行这个脚本的编译版本的不久之后,它就把我的内存都吃光了。有更好的方法来实现这个功能吗
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的解决方案中。