2016-07-21 6 views
1

現在、私はこのコードスニペットを持っています。いくつかのオブジェクトがあれば、それらの間に可能なすべての組み合わせが作成されます。combinatoryハードコードスニペットを再帰関数にするにはどうすればいいですか?

この例では、4つのオブジェクト(0,1,2,3)があると想定して、4つのオブジェクトのすべての可能な組み合わせが作成されます(0,1,2,3,1 )、02,03,12,13,23,012,013,023,123及び0123)を含む。

注意しなければならないのは、2^4 - 1 = 15の組み合わせであり、一般に2 ^オブジェクトの数 - 1の組み合わせです。

このコードで作成されるオブジェクトの順序は、0 - > 01 - > 012 - >- > 013 - > 02 - > 023 - > 03 - > 1 - > 12 - > 123 - > 13 - > 2 - > 23 - > 3

最初のオブジェクトを取得する方法とその数は、コード内の他の場所で定義されています。また、最大値を決定するオブジェクトの数(と、右の結果を与えているにもかかわらず

int count = 4; //this is gotten elsewhere 
int currPos = 0; 
var objects = new Object[(2^count)-1]; 

for (int i = 0; i < count; i++) //loop that creates combinations of only one object 
{ 
    Object obj = new Object(...); 
    objects[currPos] = obj; 
    currPos += 1; 

    for (int j = i + 1; j < count; j++) //loop that creates combinations of two objects 
    { 
     Object obj = new Object(...); 
     objects[currPos] = obj; 
     currPos += 1; 

     for (int k = j + 1; k < count; k++) //loop that creates combinations of three objects 
     { 
      Object obj = new Object(...); 
      objects[currPos] = obj; 
      currPos += 1; 

      for (int l = k + 1; l < count; l++) //loop that creates combinations of four objects 
      { 
       Object obj = new Object(...); 
       objects[currPos] = obj; 
       currPos += 1; 
      } 
     } 
    } 
} 

が、これはハードコーディングされているので、私は再帰関数にそれを変更する方法を探しています(ただし、その機能をmaintainig)組み合わせ、この例では4つ)をパラメータとして渡します。

私は例が0123から013

int count = 4; 
    int currPos = 0; 
    var objects = new Object[(2^count)-1]; 
    combinations(count, 0, currPos, objects); //called elsewhere 

    private void combinations(int numberOfObjects, int j, int count, int currPos, Object[] objects) 

    { 
     if (numberOfObjects == count) 
     { 
      for (int k = j; k < count; k++) 
      { 
       Object obj = new Object(...); 
       objects[currPos] = obj; 
       currPos += 1; 
       generateCombinations(numberOfObjects - 1, j + 1, count, currPos, objects); 
      } 
     } 

     if (numberOfObjects < count) 
     { 
      for (int l = j; l < count; l++) 
      { 
       Object obj = new Object(...); 
       objects[currPos] = obj; 
       currPos += 1; 

       (...) 

       generateCombinations(..., ..., count, currPos, objects); 
      } 
     } 
    } 
に行く、私は必要なときに「前」のループに行くように見えることはできません主な理由は、以下のコードのような何かをしようとしているが、結果なしとされている

+0

驚きの[検索](https://www.bing.com/searchことを?q = c%23%20all%20combinations)既存の解決策が見つかりませんでした... [this](http://stackoverflow.com/questions/774457/combination-generator-in-linq)のように –

+0

'generateCombinations'別の機能やスペルミス? – Groo

答えて

0

これはあなたが後にしているものですか?

public IEnumerable<string> GetCombinations(IEnumerable<string> source) 
{ 
    if (source == null || !source.Any()) 
    { 
     return Enumerable.Empty<string>(); 
    } 
    else if (source.Skip(1).Any()) 
    { 
     return new string[] { null, source.First() }.SelectMany(x => GetCombinations(source.Skip(1)), (x, y) => x + y); 
    } 
    else 
    { 
     return new string[] { null, source.First() }; 
    } 
} 

私はこのようにそれを使用することができます:

var combinations = GetCombinations(new[] { "0", "1", "2", }); 

そして、私はこの結果を得る:

 
null 
2 
1 
12 
0 
02 
01 
012 
関連する問題