我正在寻找一个f给定n元素列表的函数,该函数计算nlength 的子列表的列表n-1。此外,第n个子列表应包含除原始列表的第n个元素以外的所有元素。例如:
f [1..4] == [[2,3,4], [1,3,4], [1,2,4], [1,2,3]]
Run Code Online (Sandbox Code Playgroud)
我找到了一个似乎可行的解决方案,但是看起来很不直观:
f :: [a] -> [[a]]
f [] = []
f xs = reverse $ go (length xs - 1) xs
where
go 0 _ = [[]]
go n xs = [ y:ys | y:xs' <- tails xs, ys <- go (n-1) xs' ]
Run Code Online (Sandbox Code Playgroud)
对于性能合理的解决方案有何建议?
f xs = [ ys ++ zs | (ys, _ : zs) <- zip (inits xs) (tails xs) ]
Run Code Online (Sandbox Code Playgroud)
inits并按tails顺序提供所有前缀和后缀(请查看的结果zip (inits xs) (tails xs))。列表理解从每个非空后缀(_ : zs)中取出一个元素,然后将其余元素连接在一起。