2014-01-22 105 views
-3

ocaml的/哈斯克爾/二郎反子列表

我有一個列表L

L = [ [0, 3, 1], [7, 2], [5, 11], [7],[] ] 

而且我需要的輸出返回列表的那個列表,但是對於每個偶數子列表它應該反轉它,以便輸出爲:

L = [ [1, 3, 0], [7, 2], [11, 5], [7],[] ] 

假設我們從0計數位置。

我可能需要獲取有關列表中包含多少個子列表的信息,然後反轉每個偶數子列表。

你能給我一個答案,這是困擾我嗎?

+0

的組合,它只是二維數組? –

+0

是的,2D。包含其他列表的列表。 –

+0

二維數組或二維鏈表? –

回答

2

下面是在Haskell溶液中的骨架,通過直接的模式匹配:

reverseEverySecond :: [[a]] -> [[a]] 
reverseEverySecond []   = [] 
reverseEverySecond [x]   = [reverse x] 
reverseEverySecond (x : y : ys) = ... -- use reverse appropriately and recurse on ys 
1

逆轉單個列表,你可以使用內置的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 

但是,這可能會慢一些,因爲它涉及更多的操作和創造,然後立即破壞的元組。

+0

如果我沒有弄錯,這不是我要求的功能的完整答案 –

+1

@nobodynoone我相信這個是由設計。你沒有提供任何你自己的嘗試或代碼,所以你不應該期待一個完整的答案,只是一些提示。 – kosmikus

+0

@nobodynoone Stackoverflow不是一個請求答案的地方,它是一個請求幫助的地方。閱讀FAQ,遵守規則。我已經給你提供了你自己解決問題所需的信息。 – bheklilr

1

我建議的

cycle [id, reverse] :: [[a] -> [a]] 

zip :: [a] -> [b] -> [(a, b)] 

map (uncurry ($)) :: [(a -> b, a)] -> [b]