【发布时间】:2009-10-11 06:27:45
【问题描述】:
我正在尝试在项目 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 的解决方案。
【问题讨论】:
-
我不太了解 Haskell,但是您的最后一行代码的括号不匹配,这几乎总是一个错字。
-
嗨,这是欧拉 254 ,所以我不认为蛮力算法会起作用。但是,到目前为止,我还想不出更聪明的算法。我的程序运行了一个多小时,但仍然没有得到 g(50)..
-
@Chris Lutz:你是对的。这是一个错字
-
前36个结果好像是比较快实现的,然后就慢到爬行了。
-
我建议你算一算一个数字需要多大才能达到 150。换句话说,蛮力解决不了这个问题。
标签: haskell math optimization