2011-10-04 34 views
-6

我們如何找出使用c#代碼的數組元素的不同組合。 是否有任何內置的庫函數?不同的數組組合(C#)

例如:假設數組有元素{2,3,4,5,6,7} 那麼可能的組合是2,3,4,5,6,7,2 3,2 3 4 ,2 3 4 5等

所以基本上笏我需要的是這給基於其對於例如輸入不同組合的函數:梳(數組,2)給出輸出2 3,1 2,3 4和梳狀(陣列,3)給出輸出1 2 3 3,2 4,3 4 5等等

例如:對陣列有效comnbination = {1,2,3}和長度= 2 1 2,1 3,2 3 .....

+3

你想要什麼組合? –

+0

你是什麼意思的「組合」?你的意思是所有的「組合」,其中不同順序的元素被認爲是相同的,並且數組的所有元素都被「組合」爲自己的數組? –

+0

你對「不同組合」的含義是什麼? –

回答

2
static void Main() 
{ 
    var cnk = comb(new [] {1,2,3},2); 
    foreach (var c in cnk) 
    { 
    } 
} 

public static IEnumerable<int[]> comb(int[] a, int k) 
{ 
    if (a == null || a.Length == 0 || k < 1 || k > a.Length) 
     yield break; 

    int n = a.Length; 
    // 1 
    if (k == 1) 
     for (int i = 0; i < n; i++) 
     { 
      yield return new int[] {a[i]}; 
     } 
    else 
     { 
      // k 
      for (int i = 0; i < n - k + 1; i++) 
      { 
       var res = new int[k]; 
        for (int t = i, c = 0; t < i + k - 1; t++, c++)     
         res[c] = a[t];    
       for (int j = i + k - 1; j < n; j++) 
       {                
        res[k-1] = a[j];      
        yield return res; 
       } 
      } 
     } 
} 

您應該從這裏的算法,我的回答沒有解決您的問題 Algorithm to return all combinations of k elements from n

0

好象邏輯不是絕對正確的:

var cnk = comb(new[] { 1, 2, 3, 4 }, 3); 

這給了3個變種,但作爲一個事實際上它是4:

1 2 3 
1 2 4 
1 3 4 
2 3 4 

我猜梳子最好以遞歸的方式實現。