2012-10-09 4 views
0

많은 기능을 사용하지 않고 하나의 기능을 사용하는 데 문제가 있습니다.순열 반복과 반복 알고리즘

2^3 같은 반복과 함께 순열을 얻고 싶다면. permutations with repeats

는 얻을 :

000 
001 
101 
011 
100 
101 
110 
111 

내가이 기능을 가질 수 있습니다

static void Main(string[] args) 
    { 
     three_permutations(2); 
     Console.ReadLine(); 
    } 


    static void three_permutations(int y) 
    { 

     for (int aa = 0; aa < y; aa++) 
     { 
      for (int bb = 0; bb < y; bb++) 
      { 
       for (int cc = 0; cc < y; cc++) 
       { 
        Console.Write((aa)); 
        Console.Write((bb)); 
        Console.Write((cc)); 
        Console.WriteLine(); 
       } 
      } 
     } 

    } 

을하지만 4 (같은 2^4) 내가 생각할 수있는 유일한 방법은 이것이다 할 :

static void four_permutations(int y) 
    { 
      for (int aa = 0; aa < y; aa++) 
      { 
       for (int bb = 0; bb < y; bb++) 
       { 
        for (int cc = 0; cc < y; cc++) 
        { 
         for (int dd = 0; dd < y; dd++) 
         { 
          Console.Write((aa)); 
          Console.Write((bb)); 
          Console.Write((cc)); 
          Console.Write((dd)); 
          Console.WriteLine(); 
         } 
        } 
       } 
      } 
    } 

그러나 재귀를 사용하면 더 좋은 방법이있을 것이라고 확신합니다. 그것을 어떻게하는지. 어떤 도움을 주셔서 감사합니다. 감사.

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

+0

http://en.wikipedia.org/wiki/Permutations에서 링크를 확인하십시오. 순열에 대한 많은 양의 인쇄물과 온라인 정보가 있으므로 기존 지식 체계를 검색하는 것이 좋습니다. –

답변

4
void permutations(string text, int numberOfDigits, int numberOfChars) 
{ 
    if (numberOfDigits > 0) 
     for (int j = 0; j < numberOfChars; j++) 
      permutations(text + j.ToString(), numberOfDigits - 1, numberOfChars); 
    else textBox1.Text += text + "\r\n"; 
} 

를 계산하고 신고를 인쇄 한 예 :

permutations("", 3, 2); 
+0

아름다운. 도와 주셔서 감사합니다. – marseilles84

+0

@ispiro 좋은 하나 – Shrivallabh

+0

무엇이 그'textBox1.Text'입니까? – fubo

4

반복을 사용하는 순열은 본질적으로 다른 기준으로 계산됩니다.

public static void Permutations(int digits, int options) 
{ 
    double maxNumberDouble = Math.Ceiling(Math.Pow(options, digits)); 
    int maxNumber = (int)maxNumberDouble; 
    for (int i = 0; i < maxNumber; i++) 
    { 
     Console.WriteLine(Convert.ToString(i, options).PadLeft(3, '0')); 
    } 
} 

당신은 기본적으로 기본 8 0 ~ 2

+0

이 샘플에서는 반복 된 순열을 설명하지 않습니다. 계수 된 각 숫자는 고유합니다. –

+0

@JoelEtherton 아니요 ... 예를 들어 기본 2의 문자열로 인쇄 된 8의 결과는 1을 세 번 반복하는 '111'입니다. 이것은 여러 다른 값 (여기서'options'은 선택의 수)을 n 번 (여기서 n은'digits'입니다)으로하면'options^digits' 가능성이 있다는 사실에 달려 있습니다; 여기에는 이러한 각각의 가능성이 나열되어 있습니다. – Servy

0

을 재귀없이, 그리고에 대한 목록에 나중에 10 줄 미만으로 사용하십시오.

public IEnumerable<List<int>> YieldCombinationsOfN(int places, int digitMin, int digitMax) 
{    
    int n = digitMax - digitMin + 1; 
    int numericMax = (int)Math.Pow(n, places); 

    for (int i = 0; i < numericMax; i++) 
    { 
     List<int> li = new List<int>(places); 
     for(int digit = 0; digit < places; digit++) 
     { 
      li.Add(((int)(i/Math.Pow(n, digit)) % n) + digitMin); 
     } 
     yield return li; 
    } 
}