[英]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.