在 Haskell 中迭代所有对组合而不重复
Iterate over all pair combinations without repetition in Haskell
在 haskell 中,给定一个元素列表 xs
,用重复遍历所有对排列的最简单方法是:
[(x,y) | x <- xs, y <- xs]
我希望能够做同样的事情,但仅限于组合。如果 x 和 y 具有可比性,我可以做到
[(x,y) | x <- xs, y <- xs, x > y]
但我更喜欢更通用、更高效的解决方案(我知道渐近复杂度将保持平方,但我们可以通过避免使用过滤条件来将实际运行时复杂度减半)
怎么样:
[ (x,y) | (x:rest) <- tails xs , y <- rest ]
如果我针对特定情况 k=2
复制并简化 Math.Combinat.Sets.choose
,则得到
pairs :: [a] -> [[a]]
pairs [] = []
pairs (x:xs) = map (\y -> x:[y]) xs ++ pairs xs -- replace with \y -> (x,y) to get 2-tuples
>>> pairs [1,2,3]
[[1,2],[1,3],[2,3]]
在 haskell 中,给定一个元素列表 xs
,用重复遍历所有对排列的最简单方法是:
[(x,y) | x <- xs, y <- xs]
我希望能够做同样的事情,但仅限于组合。如果 x 和 y 具有可比性,我可以做到
[(x,y) | x <- xs, y <- xs, x > y]
但我更喜欢更通用、更高效的解决方案(我知道渐近复杂度将保持平方,但我们可以通过避免使用过滤条件来将实际运行时复杂度减半)
怎么样:
[ (x,y) | (x:rest) <- tails xs , y <- rest ]
如果我针对特定情况 k=2
复制并简化 Math.Combinat.Sets.choose
,则得到
pairs :: [a] -> [[a]]
pairs [] = []
pairs (x:xs) = map (\y -> x:[y]) xs ++ pairs xs -- replace with \y -> (x,y) to get 2-tuples
>>> pairs [1,2,3]
[[1,2],[1,3],[2,3]]