P15 - 每个元素重复 N 次

2026-09-07 00:00    #Haskell   #99题   #列表  

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[]

参考


← P14 复制每个元素 | P16 每隔 N 个删除一个元素 →