在解决问题 26(“生成从列表的 N 个元素中选择的 K 个不同对象的组合”)时,我提出了以下实现:
combi :: Int -> [a] -> [[a]]
combi 0 _ = [[]]
combi n ys@(x:xs) = [ y:xs' | y <- ys, xs' <- combi (n-1) xs ]
建议的解决方案之一是:
combinations :: Int -> [a] -> [[a]]
combinations 0 _ = [ [] ]
combinations n xs = [ y:ys | y:xs' <- tails xs
, ys <- combinations (n-1) xs']
虽然有点相似,但提供的解决方案运行速度明显快于我的。
为什么?