--Returns last N elements in list
lastN :: Int -> [a] -> [a]
lastN n xs = let m = length xs in drop (m-n) xs
--create contiguous array starting from index b within list a
produceContiguous :: [a] -> Int -> [[a]]
produceContiguous [] _ = [[]]
produceContiguous arr ix = scanl (\acc x -> acC++ [x]) [arr !! ix] inset
where inset = lastN (length arr - (ix + 1)) arr
--Find maximum sum of all possible contiguous sub arrays, modulo [n]
--d is dummy data
let d = [1,2,3,10,6,3,1,47,10]
let maxResult = maximum $ map (\s -> maximum s) $ map (\c -> map (\ac -> (sum ac)`mod` (last n)) c) $ map (\n -> produceContiguous d n) [0..(length d) -1]
我是一個Haskell福利局 - 短短几天到它。如果我做的事情顯然是錯誤的,whoopsies可以對此Haskell代碼進行哪些優化?
如果代碼正常工作,而您只是想要改進建議,則應該在codereview.stackexchange.com上發帖。否則,您需要明確指出您想解決的問題。 – chepner
這是最大的子陣列問題的一個奇怪的變化。我猜測模n'位是爲了打破標準(高效)解決方案而設計的。我不確定是否有類似的有效解決方案,但我對此表示懷疑。一般來說,模塊化算術和最大化並不能很好地齧合。 – dfeuer
在這類問題中,你應該總是包含一個規範,用簡單的話來說明程序應該做什麼。這將提供更多的可見性 - 我想大多數讀者只會看到一段代碼並停止閱讀。代碼中有一個非常簡短的代碼,在'd'上面的註釋中,但是它在噪聲中丟失了。 – chi