Haskell - 选择ln函数

jub*_*kon 0 haskell functional-programming

我必须编写一个函数choose l n,打印所有可能组合n的列表以选择列表的元素l.

作为一个例子,呼叫choose [1,2,3] 2返回[[1,2], [1,3], [2,3]][[2,1], [3,1], [3,2]]

不幸的是我不明白解决方案:

choose :: [a] -> Int -> [[a]]
choose _ 0 = [[]]
choose [] _ = []
choose (x:xs) n = (map (\ys -> x:ys) (choose xs (n-1))) ++ (choose xs n)
Run Code Online (Sandbox Code Playgroud)

我理解前两个陈述.最后一行对我来说并不清楚.

有人可以解释一下吗?

chi*_*chi 6

人们可以nx:xs两个方面选择元素:要么x被选中,要么不被选择.

如果x选择,我们将选择n-1来自的元素xs.所以,我们递归地做choose xs (n-1),然后我们添加x到顶部map (\ys -> x:ys).

如果x没有选择,我们将选择n尾部的所有元素xs.所以,我们考虑一下choose xs n.

最后,我们将所有这些选择放在一起++.