2015-05-07 26 views
0

有什麼辦法可以將下面的代碼片段轉換爲循環,而不是使用繁重的LINQ?遞歸算法,用於生成沒有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的所有可能的組合。

+3

是的,有一種方法。畢竟,LINQ的東西解決了循環。你問「這是怎麼回事?」你有沒有想過打破每一個LINQ方法調用? –

+0

感謝您的回答!是的,如果有辦法,我想知道怎麼做,因爲我不熟悉LINQ。我嘗試了幾件事情,但無法得到相同的結果... – Greg

+1

這是問題已經從算法的角度來解決[這裏](http://stackoverflow.com/questions/127704/algorithm-to-return -all組合-的-K-元件-從-N)。還要注意,刪除linq並不會改進組合算法的運行時間,因爲它們都非常慢。 –

回答

0

這是我第一次拿到這個

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說法,如果可能的話...