我只是這一個困惑,它的循環排序的,事情我無法弄清楚如何寫一個Haskell。基本上,我已經定義分裂三大功能,淺灘和洗牌。循環執行的函數在Haskell
split :: [a] -> ([a],[a])
split xs = splitAt (length xs `div` 2) xs
riffle :: [a] -> [a] -> [a]
riffle xs [] = xs
riffle [] ys = ys
riffle (x:xs) (y:ys) = x:y:riffle xs ys
shuffle :: Int -> [a] -> [a]
shuffle 0 xs = xs
shuffle n xs = shuffle (n-1) (riffle a b)
where (a, b) = split xs
基本上分裂只是分裂成兩半的列表,淺灘應該是「隔行掃描」兩份清單,因此,例如:
riffle [1,2,3] [4,5,6] = [1,4,2,5,3,6]
而且洗牌是迭代分裂的量,縮分列出項目。現在我需要定義一個函數重複,它輸出要重新獲得原始列表需要多少次重複的shuffle。該函數的定義是這樣的:
repeats :: [Int] -> Int
我只是堅持爲你怎麼能在洗牌完成一個循環。我認爲這是與列表理解,但我無法得到任何。我還沒有嘗試lambda表達式,但我不認爲這是必要的。順便說一句,洗牌應該在偶數個項目的列表上完成。有任何想法嗎?
您也可以用@hammar描述的'tail $ iterate'生成列表,並使用['elemIndex'](http://hackage.haskell.org/packages/archive/base/latest/doc/html/ Data-List.html#v:elemIndex)來查找重複的索引。 – dflemstr