2010-07-26 52 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