2014-11-04 39 views
1

我有一個列表,可以說[1,2,3,4,5],我必須在索引處旋轉列表。旋轉關於索引的列表

例如:

旋轉2 [1,2,3,4,5]給出[3,4,5,1,2]

通過在線研究,我穿過循環函數來它可以解決丟棄時丟失列表的問題,但是我覺得就理解而言,即使效率低於庫函數,我也會從中獲益更多。工作解決方案,我必須低於:

rotate :: Int -> [a] -> [a] 
rotate _ [] = [] 
rotate n l = take (length l) $ drop n (cycle l) 

你可以建議,沒有代碼,實現了該解決方案,所以我可以在這些裂紋的替代方式?因爲我現在沒有想法,所以我已經看到了這樣做的方式!

乾杯

+1

請參閱'splitAt'函數。 – user3237465 2014-11-04 18:34:55

回答

4

你可以簡單地做:

rotate n l = drop n l ++ take n l 

實現同樣沒有循環。

+0

雖然我不想要一個編碼解決方案,但它比循環更有意義。謝謝! – Bradley 2014-11-04 18:45:40

1

因爲這裏已經存在的代碼的解決方案,我會發布另一個版本:

rotate :: Int -> [a] -> [a] 
rotate n [] = [] 
rotate n xs = xs2 ++ xs1 
    where (xs1, xs2) = splitAt (n `rem` length xs) xs 

一些測試:

main = do 
    print $ rotate 0 [1..5] -- [1,2,3,4,5] 
    print $ rotate 2 [1..5] -- [3,4,5,1,2] 
    print $ rotate 5 [1..5] -- [1,2,3,4,5] 
    print $ rotate 7 [1..5] -- [3,4,5,1,2] 
0

...那簡單的解決方案呢?

rotate :: Int -> [a] -> [a] 
rotate 0 xs = xs 
rotate _ [] = [] 
rotate n (x:xs) = rotate (pred n) (xs ++ [x])