我在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
。我经常每次循环遍历列表,这需要很长时间。但实际上我不知道如何避免这种情况。
答案 0 :(得分:3)
所以你找到了问题功能。这是因为对于每个列表,您多次调用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
基本上,所有这些都是在很多情况下不需要括号。