2012-06-01 50 views
1

我有一種方法,它接收數字n作爲參數,並計算在位(0,1)數組中完全包含n 1的所有可能的組合,返回的結果是數1計算位數組中1的所有可能位置

例如假設我們的位陣列具有3元件和

for n = 1 
    the function gives : [0] - [1] - [2] (three possible positions) 
for n=2 
    the result will be [0,1] - [0,2] - [1,2] (three possible positions) 

和對於n = 3 結果將是[0,1,2](一種可能的位置)

功能正常工作與3個元素數組,但給出了4個元素

n = 2 result : [0,1] - [0,2] - [0,3] -[1,2] - [1,3] - [1,2,3] 

錯結果的任何一個都可以解釋爲什麼它給出意想不到的結果爲ARRAYSIZE預先> = 4

由於

const int arraySize = 4; 

    static private void Positions(int n, int start, ArrayList prepend, ArrayList results) 
    { 
     ArrayList tmp = new ArrayList(prepend); 
     int end = arraySize - n; 
     for (int i = start; i <= end; i++) 
     { 
      if (end < arraySize - 1) 
      { 
       prepend.Add(i); 
       Positions(n - 1, i + 1, prepend, results);      
       prepend = tmp; 
      } 
      else 
       results.Add(new ArrayList(prepend) { i }); 
     } 
    } 

這是我如何使用此方法

static void Main(string[] args) 
    { 
     ArrayList results = new ArrayList();    
     Positions(2, 0, new ArrayList(), results); 

     foreach (ArrayList array in results) 
     { 
      foreach (var elem in array) 
       Console.Write(elem); 
      Console.WriteLine(); 
     } 

     Console.Read(); 
    } 
+0

爲您3種元素,N = 2,它不應該是'[0,1] - [0 ,2] - [1,2]'? – mellamokb

+0

@mellamokb你是對的我編輯我的文章 –

回答

1

我認爲這個問題是在這一行:

prepend = tmp; 

您打算,我認爲在方法開始恢復前插陣列到原來的狀態。但是,您正在設置一個直接引用,因此每次循環迭代時都要修改原始前綴數組。如果你在這裏每一次副本的陣列中,也似乎正常工作:

prepend = new ArrayList(tmp); 

所有這些複製陣列,但是,是不是很有效。你可以嘗試刪除您剛剛添加以及另一種選擇項:

prepend.Add(i); 
Positions(n - 1, i + 1, prepend); 
prepend.Remove(i); 

然後在技術上你甚至都不需要tmp副本了。

編輯:另外,您if發言,我想你想的東西像

if (n > 1) 
+0

好抓;謝謝 –

+0

prepend.Remove(i)拋出異常 –

+0

當我在LINQPad中測試時,它對我有用。什麼是例外? – mellamokb