【问题标题】:Optimisations for a series of functions in HaskellHaskell中一系列函数的优化
【发布时间】: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


【解决方案1】:

内存问题可能出在 decToList 或 fac 中。

我用它运行过

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

而且它并没有接近吸尽我所有的 RAM,但它并没有完成。

顺便说一句:我怀疑高级项目欧拉问题比这更难。所以这个算法不行。

【讨论】:

  • 我猜这个问题中列出函数的阶乘和小数是微不足道的,除非 g(i) 的值变得非常大。但这似乎很简单!也许我明天会问我的数学老师和化学老师,他也是计算机科学的王牌。
  • @Jonno_FTW:尽管它们是微不足道的,但要调试一个神秘的错误,需要完整的图片
猜你喜欢
  • 2011-08-30
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2012-04-03
相关资源
最近更新 更多