0

我有这个代码,它是没有重复的组合公式:

combinaciones   ::  Int ->[Int]->[[Int]]
combinaciones   0   _   =   [[]]
combinaciones   _   []  =   []
combinaciones   k   (x:xs)  =   [x:ys | ys <- combinaciones (k - 1) xs] ++ combinaciones k xs

combinationsN   ::  Int ->Int->[[Int]]
combinationsN   n   k   =   combinaciones   k   [1..n]

我的问题是我想返回一个列表列表,其中包含列表中的列表数量,一对:([[Int]],Int)。我怎样才能做到这一点?

4

1 回答 1

1

这是简单的版本 - 通过计数可能会更有效,但这是我在凌晨 1 点能想到的。

combinationsWithCount :: Int -> [Int] -> ([[Int]], Int)
combinationsWithCount n xs = let cs = combinaciones n xs
                             in (cs, length cs)

编辑:好的,让我也尝试编写智能版本。

combinaciones   ::  Int -> [Int] -> ([[Int]], Int)
combinaciones   0   _   =   ([[]], 1)
combinaciones   _   []  =   ([], 0)
combinaciones   k   (x:xs)  =
    let (first, firstN) = combinaciones (k - 1) xs
        (second, secondN) = combinaciones k xs
    in ([x:ys | ys <- first] ++ second, firstN + secondN)

绝对不能保证这会做正确的事,我半睡半醒。;-)

于 2013-05-01T23:10:21.453 回答