生成元组模索引

发布于 2024-09-11 10:00:28 字数 108 浏览 7 评论 0原文

我正在寻找一种生成所有元组的算法(或类似 C 的实现,没有可用的 itertools) [a_0 a_1 ... a_(n-1)] 使得 0 <= a_i <= i + 1。也欢迎指向文献。

I am looking for an algorithm (or a C-like implementation, no itertools available) which generates all tuples
[a_0 a_1 ... a_(n-1)] such that 0 <= a_i <= i + 1. Pointers to literature are also welcome.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心如荒岛 2024-09-18 10:00:28

像这样的东西?

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

something like this?

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);
    }
}
庆幸我还是我 2024-09-18 10:00:28

这就是所谓的回溯。搜索维基百科有关它。您可以递归或迭代地进行。

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

It's called backtracking. Search wikipedia about it. You can do it both recursive or iterative.

Amir, he wants between 0 and i + 1, not between 0 and i. And i think passing arrays on the stack is slower thant accesing them as global.

I think you want something like this:

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);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文