我寫在Haskell一個函數,它看起來像這樣: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個innerLists列表調用它,計算maxSumme需要一分鐘時間。那不正常不是嗎?我一定犯了一個錯誤,但是我找不到它。我怎樣才能優化我的方法?有沒有更快的方法來做到這一點?
編輯:我覺得發現了錯誤。我確信它是maxSumme l then maxSumme l
。我每次循環遍歷列表,並且需要很長時間。但實際上我不知道如何避免這種情況。
'let'解除'maxSumme l'將時間複雜度從指數式降低到線性。懶惰語言中的CSE並不總是可行,但在這種情況下。 –
我是Haskell的新手。左提升和CSE意味着什麼?如果我可以將它改變爲線性函數,那將是非常好的。 – Cilenco
他意味着在'let ssx = subSumme x in ...'中重複'subSumme x'的代碼(並且用'ssx'替換'subSumme x')。這就像定義一個新的變量一樣。 'maxSumme l'也是一樣。 CSE的意思是「共同的子表達式消除」。如果編譯器意識到這些表達式是相同的,那麼它可以完成我們剛剛描述的內容,並將代碼中的_hell_視爲代碼,但由於某種原因它沒有(可能並不總是像Philip所建議的那樣)。 – Guido