首页 > 解决方案 > 偶数索引上列表的重复元素

问题描述

在 Haskell 中,我如何实现一个函数dup来复制列表中偶数位置 (0,2,4...) 上的所有元素

dup :: [a] -> [a]
dup [] = []
dup (x:xs) =  x : x : dup xs
//but only on even index ??

调用示例:

dup [1,5,2,8,4] = [1,1,5,2,2,8,4,4]

标签: haskellfunctional-programming

解决方案


好吧,我们可以定义两个执行相互递归的函数:dupeven :: [a] -> [a]dupodd :: [a] -> [a]dupeven因此将复制第一个元素,并递归地传递到dupodd. dupodd另一方面,只制作一个头部副本,然后在 上执行递归dupeven。像:

dupeven :: [a] -> [a]
dupeven [] = []
dupeven (x:xs) = x : x : dupodd xs

dupodd :: [a] -> [a]
dupodd [] = []
dupodd (x:xs) = x : dupeven xs

好消息是我们得到了两个重复的变体。[]此外,这两个函数都相当简单:它们只对空列表和 "cons"两种不同的模式进行操作(:)

因此,这可以按预期工作,而且我们基本上以(相当)低的实现成本有一个额外的功能:

Prelude> dupeven [1,5,2,8,4]
[1,1,5,2,2,8,4,4]
Prelude> dupodd [1,5,2,8,4]
[1,5,5,2,8,8,4]

推荐阅读