Algorithm 生成元组模索引
我正在寻找一种生成所有元组的算法(或类似C的实现,没有可用的itertools) [a_0 a_1…a_(n-1)]这样0像这样吗Algorithm 生成元组模索引,algorithm,tuples,combinatorics,Algorithm,Tuples,Combinatorics,我正在寻找一种生成所有元组的算法(或类似C的实现,没有可用的itertools) [a_0 a_1…a_(n-1)]这样0像这样吗 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,
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);
}
}
void打印元组(int n,int[]a,int i=0){
如果(i==n){
//打印
返回;
}
对于(intj=0;j这叫做回溯。搜索维基百科。你可以递归或迭代地进行
Amir,他想要的是介于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);
}
}
inta[你的长度];
无效回溯(整数n,整数计数器){
如果(计数器==n){
//做任何事
返回;
}
对于(int j=0;j)a_i是否有其他限制?例如a_i>=0?您需要此解决方案a[0]我接受答案,因为它对我有帮助。谢谢!但是解决方案不正确。您的函数给出(对于n=3)00000 100201010011012。@约翰,你在修复后试过吗?现在试过我的,它给出00000 100200301010101201302002102220231001102103110111112113120121122123I修复了通常最好避免全局。这是回溯,使用全局可能赢得的几毫秒肯定不值得。Teodor,你放弃了ot将Amir解决方案中的“i”替换为“counter”,不是吗?谢谢您提供的“backtracking”信息。嗯,我知道,我是一个令人头疼的人,但仍然有一个“i”…和一个缺少的“}”。但当我超过SO规定的15分限制时,我会给你一分。