【发布时间】:2012-05-01 16:31:18
【问题描述】:
我只是对这个感到困惑,它是一个 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 表达式,但我认为没有必要。顺便说一句,应该在具有偶数个项目的列表上进行洗牌。有什么想法吗?
【问题讨论】:
标签: haskell loops repeat shuffle