【问题标题】:recursive algo for producing combinations without linq用于在没有 linq 的情况下生成组合的递归算法
【发布时间】:2015-05-07 18:06:34
【问题描述】:

有没有办法将下面的代码 sn-p 转换为使用 for 循环而不是大量使用 LINQ?

public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k)
{
    return k == 0
       ? new[] {new T[0]}
       : elements.SelectMany((e, i) =>
             elements.Skip(i + 1).Combinations(k - 1).Select(c => (new[] {e}).Concat(c)));
}

我们的目标是想出给定元素列表大小为 k 的所有可能组合。

【问题讨论】:

  • 是的,有办法。毕竟,LINQ 的东西解析为循环。你是在问“路是什么?”您是否考虑过分解每个 LINQ 方法调用?
  • 感谢您的回答!是的,如果有办法,我想知道如何,因为我对 LINQ 不是很熟悉。我尝试了几件事,但无法获得相同的结果...
  • 这个问题已经从算法的角度解决了here。另请注意,删除 linq 不会提高组合算法的运行时间,因为它们都往往非常慢。
  • 快速的 Google 搜索显示 dotnetgeek.tumblr.com/post/5205119053/…,看起来它可以满足您的需求。
  • @JamesC.TaylorIV 好吧,提供的解决方案效率极低,因为它一次又一次地重新计算相同的值。重写它留下了很大的改进空间。现在,即使是一个很好的实现,扩展性也很差,但它很容易比现在更有效。

标签: c# algorithm linq recursion combinations


【解决方案1】:

这是我的第一次尝试

    public static IEnumerable<IEnumerable<int>> Combs(List<int> e, int size)
    {
            for (int i=0; i< e.Count; i ++)
            {                
                if (size  == 1)                    
                    yield return new[] {e[i]};

                foreach ( var next in Combs(e.GetRange(i + 1, e.Count - (i + 1)), size  - 1) )
                    yield return new[] { e[i] }.Concat(next);
            }      
    }

但是,如果可能的话,我想简化 foreach 语句,可能还有 concat 参数...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多