2010-07-26 51 views
4

我正在尋找一個算法(或C類實現,沒有itertools可用),它生成所有元組 [a_0 a_1 ... a_(n-1)],使得0 < = a_i < = i + 1。也歡迎文學指導。生成元組模索引

+0

有沒有對A_I任何其他限制?例如a_i> = 0? – 2010-07-26 14:07:13

+0

a_i> = 0,是的!謝謝! – John 2010-07-26 14:24:36

回答

3

這樣的事情?

void printTuples (int n, int[] a, int i=0) { 
    if (i == n) { 
     //print a 
     return; 
    } 
    for (int j=0; j<=i+1; j++) { 
     a[i] = j; 
     printTuples (n, a, i+1); 
    } 
} 
+0

你需要j <= i + 1可能在循環條件下。 – Vladimir 2010-07-26 14:07:54

+0

@Vladimir修復,謝謝。 – 2010-07-26 14:10:15

+0

我也假設a_i> = 0。 – 2010-07-26 14:11:09

0

它被稱爲回溯。搜索關於它的維基百科。你可以做遞歸或迭代。

埃米爾,他希望在0和i + 1之間,而不是在0和i之間。我認爲將數組傳遞到堆棧的速度要慢於將它們作爲全局數組訪問。

我想你想是這樣的:

int a[YOUR_LENGTH]; 

void backtracking (int n, int counter) { 
    if (counter == n) { 
     // do whatever 
     return; 
    } 
    for (int j = 0; j <= counter + 1; ++ j) { 
     a[counter] = j; 
     backtracking(n, counter + 1); 
    } 
} 
+0

我修正了<=問題,數組作爲指針傳遞。無論如何,我不知道他將使用哪種語言和平臺,所以它並不真正相關。 – 2010-07-26 14:15:11

+1

通常最好避免使用全局變量。這是回溯,你可能通過使用全球贏得的幾毫秒絕對不值得。 – IVlad 2010-07-26 14:32:57

+0

特奧多,你忘了用'櫃檯'代替'艾米爾'的解決方案,不是嗎?感謝有關'回溯'的信息。 – 2010-07-26 17:14:04