【问题标题】:Iterate over all pair combinations without repetition in Haskell在 Haskell 中迭代所有对组合而不重复
【发布时间】:2015-01-28 11:27:50
【问题描述】:

在 haskell 中,给定一个元素列表xs,通过重复遍历所有对排列的最简单方法是:

[(x,y) | x <- xs, y <- xs]

我希望能够做到这一点,但仅限于组合。如果 x 和 y 具有可比性,我可以这样做

[(x,y) | x <- xs, y <- xs, x > y]

但我更喜欢更通用、更高效的解决方案(我知道渐近复杂度将保持平方,但我们可以通过避免使用过滤条件将实际运行时复杂度减半)

【问题讨论】:

    标签: haskell functional-programming tuples combinations


    【解决方案1】:

    怎么样:

    [ (x,y) | (x:rest) <- tails xs , y <- rest ]
    

    【讨论】:

      【解决方案2】:

      如果我针对特定情况 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]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2021-04-22
        • 1970-01-01
        相关资源
        最近更新 更多