P15 - 每个元素重复 N 次
Replicate elements of a list a given number of times
官方模块:
Problems.P15核心函数:repli
← P14 复制每个元素 | P16 每隔 N 个删除一个元素 →
题目描述
将列表中的每个元素重复指定的次数。
函数签名
1repli :: [a] -> Int -> [a]
思路
repli xs n = 对每个 x,输出 replicate n x,然后拼接。
这实际上是 P14(每个元素重复 2 次)的泛化版本。
实现
方法一:递归
1repli :: [a] -> Int -> [a]
2repli [] _ = []
3repli (x:xs) n = replicate n x ++ repli xs n
对每个元素 replicate 后递归拼接。
方法二:concatMap
1repli :: [a] -> Int -> [a]
2repli xs n = concatMap (\x -> replicate n x) xs
也可以写成无参风格:
1repli :: [a] -> Int -> [a]
2repli xs n = concatMap (replicate n) xs
方法三:列表推导
1repli :: [a] -> Int -> [a]
2repli xs n = [x | x <- xs, _ <- [1..n]]
_ <- [1..n] 让每个 x 被重复 n 次。
repli vs replicate
注意区分两个名字相近的函数:
| 函数 | 作用 |
|---|---|
replicate n x | 生成 n 个 x 组成的列表 |
repli xs n | 把列表 xs 的每个元素重复 n 次 |
测试
1>>> repli "abc" 3
2"aaabbbccc"
3
4>>> repli [1,2] 4
5[1,1,1,1,2,2,2,2]
6
7>>> repli [] 5
8[]