我只是这一个困惑,它的循环排序的,事情我无法弄清楚如何写一个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