2017-01-29 64 views
2

我張貼this similar, previous question,但我也不是很清楚。更改此嵌套的for循環遞歸

我有以下代碼:

int N=4; 
int[] myArray = new int[N]; 
for (int i1 = 1; i1 < N; i1++) 
    myArray[0]=i1; 
    for (int i2 = 1; i2 < N; i2++) 
     myArray[1]=i2; 
      for (int i3 = 1; i3 < N; i3++) 
       myArray[2]=i3; 
       for (int i4 = 1; i4 < N; i4++) 
       { 
        myArray[3]=i4; 

        foreach (var item in myArray) 
         Console.Write(item.ToString()); 
        Console.Write(Environment.NewLine); 
       } 

此輸出以下:

1111 
1112 
1113 
1121 
1122 
1123 
1131 
.... 
3332 
3333 

有沒有一種簡單的方法來改變這種嵌套for循環,遞歸?我對編程不熟練,所以越簡單越好。我並不擔心代碼的效率。

我希望能夠將我的代碼中的int N更改爲不同的數字,而無需在我的代碼中添加或刪除任何內容。

編輯

這是我到目前爲止有:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 

namespace Sandbox 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      int class_length = 4; 
      int[] toric_class = Enumerable.Repeat(1, class_length).ToArray(); 
      Recursion(toric_class, class_length, 1, 3); 

      Console.Read(); 
     } 
     static void Recursion(int[] toric_class, int length, int number, int spot) 
     { 
      if (number < 4) 
      { 
       toric_class[spot] = number; 
       foreach (var item in toric_class) 
       { 
        Console.Write(item.ToString()); 
       } 
       Console.Write(Environment.NewLine); 
       Recursion(toric_class, length, number + 1, spot); 
      } 
     } 
    } 
} 

這隻輸出

1111 
1112 
1113 

我不確定在哪裏何去何從。

+0

功課?除此之外,你的5迴路結構看起來設計不好。而不是想着遞歸(記住堆棧溢出),你能想到的數據結構。 – mnemonic

+0

你應該有編輯前一個問題,因此它可以被重新打開。我正在投票結束重複。 – Amy

+0

@記憶力不,不做功課,只是爲了我自己的利益而努力。 – Bonnaduck

回答

1
public static void Set(int[] array, int index, int N) 
{ 
    if (index == N) 
    { 
     foreach (var item in array) 
      Console.Write(item.ToString()); 
     Console.Write(Environment.NewLine); 
     return; 
    } 
    for (int i = 1; i < N; i++) 
    { 
     array[index] = i; 
     Set(array, index + 1, N); 
    } 
} 

,並調用它是這樣的:

int N = 4; 
int[] myArray = new int[N]; 
Set(myArray, 0, N); 
+0

這很好(只需要將if(index == 4)'改爲'== N'),我相信我完全理解它。非常非常感謝你! – Bonnaduck

+0

是的,我的失誤,與4,已經糾正了,你是wekcome。 –

+0

我刪除了評論,因爲我找到了解決方法。但是現在我明白爲什麼它不起作用。再次謝謝你! – Bonnaduck

1

如果你想只是爲了簡化概括的孤子,你不希望任何遞歸:

// N - length of the array 
// K - kind of radix; items of the array will be in [1..K] range 
private static IEnumerable<int[]> Generator(int N = 4, int K = 3) { 
    int[] items = Enumerable 
    .Repeat(1, N) 
    .ToArray(); 

    do { 
    yield return items.ToArray(); // .ToArray() : let's return a copy of the array 

    for (int i = N - 1; i >= 0; --i) 
     if (items[i] < K) { 
     items[i] += 1; 

     break; 
     } 
     else 
     items[i] = 1; 
    } 
    while (!items.All(item => item == 1)); 
} 

測試

string test = string.Join(Environment.NewLine, Generator(4) 
    .Select(items => string.Concat(items))); 

Console.Write(test); 

結果:

1111 
1112 
1113 
1121 
1122 
... 
3321 
3322 
3323 
3331 
3332 
3333 
+0

我可以問爲什麼我們不想要任何遞歸嗎? – Bonnaduck

+1

@Bonnaduck:如果'N'很大*,你可以有一個*深* recoursion,和*用完*。 –