代码之家  ›  专栏  ›  技术社区  ›  Jonno_FTW

Haskell中一系列函数的优化

  •  0
  • Jonno_FTW  · 技术社区  · 17 年前

    我试图在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的解决方案中。

    1 回复  |  直到 11 年前
        1
  •  2
  •   yairchu    17 年前

    记忆问题可能存在于dectolist或fac。

    我和它一起跑步

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

    它并没有接近吸吮我所有的公羊,但它没有结束。

    顺便说一句:我怀疑高级项目Euler问题比这更难。因此,该算法不起作用。

    推荐文章