2016-06-14 50 views
0

我想創建一個數字組合列表,它只包含三個數字(0, 1, 2)。如果n=1那麼結果是這樣的{0, 1, 2}。如果n=2那麼結果是{00, 01,02, 10, 11, 12, 20, 21, 22}。如果n=3的結果將如{000,001 etc 222}。我試圖用遞歸來創建這個函數。但我未能創建。我如何使用迭代來創建這樣的列表。任何人都可以幫助我創建三位數的數字0,1,2?

+0

埃裏克利珀有一個[不錯的博客(HTTPS: //ericlippert.com/2013/04/15/producing-permutations-part-one/)。 –

回答

0

遞歸方法在這裏可以很好地工作,如果你內存不足,你可能會採用rong方式,或者你可能只是有一個bug。

如果您想通過迭代要做到這一點,你可以看看這個問題是這樣的:你希望所有的數字從0到3^n - 1在基地3.現在你只需要convert to base 3(與0墊)

0

嘗試轉換爲字符串,檢查(長度< = n),並在必要時預先設置(n長度)0。 [編輯]也就是說,假設你正在談論的格式... [EDIT V2]我相信這是不是最快的方式來做到這一點,但你可以遞歸列出從0 - x的所有數字,並使用前述字符串方法迭代數字,檢查是否使用了0 - n以外的任何字符。

+0

是的...我試過遞歸。但內存使用量太大......如果n> 10。我怎麼能使用迭代編碼。 – Bommu

+0

組裝字符串的內存使用情況? 3^10 = 59049,所以即使他們給出了一個巨大的高估,每個只有14MB的256字節。你真的需要存儲字符串 - 你可以輸出它們嗎? – Rup

+0

n的最高值是多少?你會如何表示n = 37(10num + 26alpha + 1)? –

0

此代碼將爲您提供有關如何遞歸處理這些問題的想法。由於遞歸性質,它會有相當多的重複。我留給你刪除those.Also它打印輸出所有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; 
    } 

測試代碼:

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

入住這Gist

相關問題