2017-01-29 4 views
2

Ich postete this similar, previous question, aber ich war nicht sehr klar.Ändern Sie diese verschachtelte for-Schleife zu Rekursion

Ich habe den folgenden Code:

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); 
       } 

Dies gibt die folgenden:

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

Gibt es eine einfache Möglichkeit, diese verschachtelte for Schleife Rekursion zu ändern? Ich bin nicht sehr geschickt im Programmieren, also je einfacher, desto besser. Ich mache mir keine Sorgen darüber, wie effizient der Code ist.

Ich würde effektiv in der Lage sein, die int N in meinem Code zu verschiedenen Nummern zu ändern, ohne etwas aus meinem Code hinzufügen oder entfernen.

EDIT

Hier ist, was ich bisher habe:

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); 
      } 
     } 
    } 
} 

Diese nur Ausgänge

1111 
1112 
1113 

Ich bin nicht sicher, wo man von hier geht.

+0

Hausaufgaben? Ansonsten sieht deine Konstruktion mit 5 Loops nicht gut aus. Anstatt über eine Rekursion nachzudenken (erinnern Sie sich an Stack-Überlauf), könnten Sie über Datenstrukturen nachdenken. – mnemonic

+0

Sie sollten die vorherige Frage bearbeiten, damit sie erneut geöffnet werden kann. Ich stimme für das Schließen als Duplikat. – Amy

+0

@mnemonic Nein, keine Hausaufgaben, einfach nur zu meinem eigenen Vorteil. – Bonnaduck

Antwort

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); 
    } 
} 

Und es so nennen:

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

Das funktioniert großartig (muss nur 'if (index == 4)' in '== N') ändern, und ich glaube, ich verstehe es vollständig. Vielen vielen Dank! – Bonnaduck

+0

Ja, mein Fehler, mit 4, habe es korrigiert, Sie sind willkommen. –

+0

Ich habe den Kommentar gelöscht, da ich einen Weg gefunden habe. Aber jetzt verstehe ich, warum es nicht funktioniert hat. Nochmals vielen Dank! – Bonnaduck

1

Wenn Sie wollen einfach nur vereinfachen und die solition verallgemeinern, Sie wollen keine Rekursion:

// 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)); 
} 

Test

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

Console.Write(test); 

Ergebnis:

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

Darf ich fragen, warum wir keine Rekursion wollen? – Bonnaduck

+1

@Bonnaduck: Falls 'N' * groß * ist, können Sie eine * tiefe * Rekursion haben und * keinen Stapel mehr haben *. –

Verwandte Themen