繁体   English   中英

Haskell方法太慢了

[英]Haskell method is too slow

我在Haskell中编写了一个函数,如下所示:

maxSumme :: [[Int]] -> Int
maxSumme [] = 0
maxSumme (x:l) = if subSumme x < maxSumme l then maxSumme l else subSumme x

subSumme :: [Int] -> Int
subSumme [] = 0             
subSumme (x:l) = x + subSumme(l)

-- function call
maxSumme [[7,2,4],[5,8,1],[7,9,2]] -- with 25 innerLists

我测试了它,但这种方法非常慢。 如果我使用包含3个项目的25个内部列表的列表来调用它,则需要花费一分钟来计算maxSumme。 那不正常不是吗? 我一定犯了一个错误,但我找不到。 我该如何优化我的方法? 有更快的方法吗?

编辑:我认为发现了错误。 我确信这是maxSumme l then maxSumme l 我经常每次循环遍历列表,这需要很长时间。 但实际上我不知道如何避免这种情况。

所以你找到了问题的功能。 这是因为对于每个列表,您多次调用subSumme 您可以做的是将subSumme映射到传递给maxSumme每个列表,然后找到这些数字的最大值:

maxSumme xs = maximum $ map subSumme xs

如果你不能使用maximum ,你需要弄清楚如何自己实现= P.


要解释$运算符,它意味着始终在左侧之前运行所有内容。 它表达如下

f (g (h (i (j (k (l x))))))

f $ g $ h $ i $ j $ k $ l x

请注意,使用多个参数的函数会变得棘手。 这不会编译

map $ (1+) $ replicate 10 1

因为它是一样的

  map ((1+) (replicate 10 1))
= map ((1+) replicate 10 1))
= map (1 + replicate 10 1)
= map (1 + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
         ^------ Can't add a number to a list!

但你可以做到

map (1+) $ replicate 10 1

基本上,它的全部内容是在很多情况下不需要括号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM