【问题标题】:Generating tuples modulo index生成元组模索引
【发布时间】:2010-07-26 13:58:18
【问题描述】:

我正在寻找一种生成所有元组的算法(或类似 C 的实现,没有可用的 itertools) [a_0 a_1 ... a_(n-1)] 使得 0

【问题讨论】:

  • a_i 还有其他限制吗?例如 a_i >=0?

标签: algorithm tuples combinatorics


【解决方案1】:

这样的?

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

【讨论】:

  • 你需要 j
  • 在这个解决方案中 a[0]
  • 我接受这个答案,因为它对我有帮助。谢谢!然而解决方案是不正确的。您的函数给出(对于 n=3)000,001,002,010,011,012。
  • @John 修复后你试过了吗?
  • 现在试了,结果是000,001,002,003,010,011,012,013,020,021,022,023,100,101,102,103,110,111,112,113,120,121,122,123
【解决方案2】:

这称为回溯。搜索有关它的维基百科。您可以递归或迭代。

阿米尔,他想要介于 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);
    }
}

【讨论】:

  • 我修复了
  • 通常最好避免使用全局变量。这是回溯,使用全局变量可能赢得的几毫秒绝对不值得。
  • Teodor,您忘记将 Amir 解决方案中的“i”替换为“counter”,不是吗?感谢您提供有关“回溯”的信息。
  • 嗯,我很头疼,我知道,但还有一个“我”。 ...以及缺少的“}”。但是当我超过 SO 规定的 15 分限制时,我会给你一分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多