为什么我的实现如此缓慢?(#99个haskell问题中的26个)

为什么我的实现如此缓慢?(#99个haskell问题中的26个),haskell,optimization,combinations,Haskell,Optimization,Combinations,在解决问题26(“生成从列表的N个元素中选择的K个不同对象的组合”)时,我想到了以下实现: combi :: Int -> [a] -> [[a]] combi 0 _ = [[]] combi n ys@(x:xs) = [ y:xs' | y <- ys, xs' <- combi (n-1) xs ] combi::Int->[a]->[[a]] 组合0[u0=[]] 组合nys@(x:xs)=[y:xs'| y 您的解决方案不正确。例如,组合2[1,2]是[[1

在解决问题26(“生成从列表的N个元素中选择的K个不同对象的组合”)时,我想到了以下实现:

combi :: Int -> [a] -> [[a]]
combi 0 _ = [[]]
combi n ys@(x:xs) = [ y:xs' | y <- ys, xs' <- combi (n-1) xs ]
combi::Int->[a]->[[a]]
组合0[u0=[]]
组合nys@(x:xs)=[y:xs'| y
  • 您的解决方案不正确。例如,
    组合2[1,2]
    [[1,2],[2,2]]
    而不是
    [[1,2]]

  • 您的递归案例总是计算
    combi(n-1)xs
    ,其中
    length xs==length ys-1
    。在正确的解决方案中,
    xs'
    的长度会随着每一步而减少。这似乎是一个小的差异,但递归会使其复杂化


  • 只是一个递归的问题(+不正确的解决方案…)那么?与tails的严格性或与懒惰评估相关的东西无关?是的,我认为这是主要原因。
    combinations :: Int -> [a] -> [[a]]
    combinations 0 _  = [ [] ]
    combinations n xs = [ y:ys | y:xs' <- tails xs
                               , ys <- combinations (n-1) xs']