ocaml的/哈斯克爾/二郎反子列表
我有一個列表L
L = [ [0, 3, 1], [7, 2], [5, 11], [7],[] ]
而且我需要的輸出返回列表的那個列表,但是對於每個偶數子列表它應該反轉它,以便輸出爲:
L = [ [1, 3, 0], [7, 2], [11, 5], [7],[] ]
假設我們從0計數位置。
我可能需要獲取有關列表中包含多少個子列表的信息,然後反轉每個偶數子列表。
你能給我一個答案,這是困擾我嗎?
ocaml的/哈斯克爾/二郎反子列表
我有一個列表L
L = [ [0, 3, 1], [7, 2], [5, 11], [7],[] ]
而且我需要的輸出返回列表的那個列表,但是對於每個偶數子列表它應該反轉它,以便輸出爲:
L = [ [1, 3, 0], [7, 2], [11, 5], [7],[] ]
假設我們從0計數位置。
我可能需要獲取有關列表中包含多少個子列表的信息,然後反轉每個偶數子列表。
你能給我一個答案,這是困擾我嗎?
下面是在Haskell溶液中的骨架,通過直接的模式匹配:
reverseEverySecond :: [[a]] -> [[a]]
reverseEverySecond [] = []
reverseEverySecond [x] = [reverse x]
reverseEverySecond (x : y : ys) = ... -- use reverse appropriately and recurse on ys
逆轉單個列表,你可以使用內置的reverse
功能。爲了在交替元素上進行操作,您可以通過幾種方式來處理它。你可以這樣寫
addEveryOther :: Int -> [Int] -> [Int]
addEveryOther n (x:y:xs) = x + n : y : addEveryOther xs
addEveryOther n (x:[]) = x + n : []
addEveryOther n [] = []
功能或者,你可以不喜歡
addEveryOther n xs = map go $ zip [0..] xs
where
go (i, x) = if even i then x + n else x
但是,這可能會慢一些,因爲它涉及更多的操作和創造,然後立即破壞的元組。
我建議的
cycle [id, reverse] :: [[a] -> [a]]
zip :: [a] -> [b] -> [(a, b)]
map (uncurry ($)) :: [(a -> b, a)] -> [b]
的組合,它只是二維數組? –
是的,2D。包含其他列表的列表。 –
二維數組或二維鏈表? –