2016-06-14 6 views
0

Ich möchte eine Liste von Zahlenkombinationen erstellen, die nur aus drei Ziffern besteht: (0, 1, 2). Wenn n=1 dann ist das Ergebnis wie folgt {0, 1, 2}. Wenn n=2 dann Ergebnis ist {00, 01,02, 10, 11, 12, 20, 21, 22}. Wenn n=3 wird das Ergebnis wie {000,001 etc 222} sein. Ich habe versucht, diese Funktion mit Rekursion zu erstellen. aber ich konnte nicht erstellen. Wie kann ich Iterationen verwenden, um eine solche Liste zu erstellen.kann mir jemand helfen, ternäre Zahlen von Ziffern 0,1,2 zu erstellen?

+0

Eric Lippert hat einen [schönen Blog] (https: //ericlippert.com/2013/04/15/producing-permutations-part-one/) über Permutationen. –

Antwort

0

Ein rekursiver Ansatz könnte hier gut funktionieren. Wenn Sie nicht genügend Speicher haben, könnten Sie den Rong-Weg gehen, oder Sie könnten nur einen Fehler haben.

Wenn Sie diese Iteration tun möchten, können Sie das Problem auf diese Weise aussehen: Sie alle Zahlen von 0 bis 3^n - 1 in Basis 3 jetzt Sie müssen nur convert to base 3 (und Pad mit 0s)

0

Versuchen Sie, in Strings zu konvertieren, indem Sie die (Länge < = n) und die (n - Länge) 0s bei Bedarf prüfen. [EDIT] Das heißt, vorausgesetzt, Sie sprechen über die Formatierung ... [EDIT v2] Ich bin sicher, dass dies nicht der schnellste Weg ist, aber Sie könnten rekursiv alle Zahlen von 0 - x auflisten und die zuvor genannten verwenden string-Methoden, um über die Zahlen zu iterieren und zu prüfen, ob andere Zeichen als 0 - n verwendet werden.

+0

ja ... Ich habe Rekursion versucht. aber der Speicherverbrauch ist zu groß ... wenn n> 10. Wie könnte ich das mit Iterationen programmieren? – Bommu

+0

Die Speicherauslastung, um die Strings zusammenzusetzen? 3^10 = 59049, also selbst wenn sie eine riesige Überschätzung von 256 Bytes bekommen, sind das nur 14 MB. Müssen Sie die Strings wirklich speichern - können Sie sie einfach so ausgeben, wie Sie sie generieren? – Rup

+0

Was ist der höchste Wert von n? Wie würdest du n = 37 (10num + 26alpha + 1) darstellen? –

0

wollen Dieser Code gibt Ihnen eine Vorstellung davon, wie Sie diese Probleme rekursiv angehen können. Wegen der rekursiven Natur wird es eine Menge Duplikate haben. Ich überlasse das Sie zu entfernen those.Also es Ausgabe druckt für alle n

public void GetMaxPerm(int[] array, int k, List<int> output, int start, int end) 
    { 
     string str = GetString(output); 
     Console.WriteLine(str); 
     if (k == end) 
     { 

      return; 
     } 
     for (int i = start; i < end; i++) 
     { 
      output.Add(array[i]); 
      GetMaxPerm(array, k + 1, output, start , end); 
      output.Remove(array[i]); 
      GetMaxPerm(array, k + 1, output, start, end); 
     } 

     return; 

    } 

    private string GetString(List<int> output) 
    { 
     string opString = String.Empty; 
     foreach (var str in output) 
     { 
      opString = opString + String.Format(" {0} ", str); 
     } 
      return opString; 
    } 

Testcode:

[TestMethod()] 
    public void GetMaxTest1() 
    { 
     int[] array = new[] { 0, 1, 2 }; 
     Class obj = new Class(); 
     List<int> output = new List<int>(); 
     obj.GetMaxPerm(array, 0, output, 0, 3); 
    } 

prüfen diese Gist