在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]
最佳答案
好了,我们可以定义两个执行相互递归的函数: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]