我只是对这个感到困惑,这是一个 Haskell 循环之类的东西,我不知道如何编写。基本上,我已经定义了三个函数split、riffle和shuffle。
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
基本上 split 只是将一个列表分成两半, riffle 应该“交错”两个列表,例如:
riffle [1,2,3] [4,5,6] = [1,4,2,5,3,6]
而 shuffle 就是迭代列表项的拆分和 riffling 的数量。现在我需要定义一个函数repeats,它输出重新获得原始列表需要多少次随机播放。函数定义如下:
repeats :: [Int] -> Int
我只是不知道如何在随机播放中执行循环......我认为这与列表理解有关,但我什么也得不到。我还没有尝试过 lambda 表达式,但我认为没有必要。顺便说一句,应该在具有偶数个项目的列表上进行洗牌。有任何想法吗?