将其制作成递归算法的可能方法?

发布于 2024-12-19 10:00:19 字数 862 浏览 0 评论 0原文

我试图让一个包含 n 个元素的数组像这样排列:

permute(x,y,z)
permute(-x,y,z)
permute(x,-y,z)
permute(-x,-y,z)

这就像二进制递增(如果 - 符号代表 1)。 我试图在代码中做到这一点,并且注意到了这一点:

    list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        perm(list, k, m);
        list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        list[3] = -list[3];
        perm(list, k, m);
        list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        perm(list, k, m);
        list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        list[3] = -list[3];
        list[4] = -list[4];
        perm(list, k, m);

我注意到有些部分是重复的。有没有办法将其写入循环?谢谢。

I am trying to have an array with n elements permute through like so:

permute(x,y,z)
permute(-x,y,z)
permute(x,-y,z)
permute(-x,-y,z)

It is like incrementing in binary (if the - signs represented 1s).
I am attempting to do that in code, and have noticed this:

    list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        perm(list, k, m);
        list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        list[3] = -list[3];
        perm(list, k, m);
        list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        perm(list, k, m);
        list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        list[3] = -list[3];
        list[4] = -list[4];
        perm(list, k, m);

I have noticed that some sections repeat. Is there a way to write this into a loop? Thanks.

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

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

发布评论

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

评论(1

帅气称霸 2024-12-26 10:00:19

这将根据您的方案返回第 k 个排列:

IEnumerable<int> Perm(IEnumerable<int> source, int k)
{
    return source.Select((x, i) => ((k >> i) & 1) == 1 ? -x : x);
}

示例:

var data = new[] { 1, 2, 3, 4 };

for (int k = 0; k < (1 << data.Length); k++)
{
    Console.WriteLine(string.Join(", ", Perm(data, k)));
}

输出:

1, 2, 3, 4
-1, 2, 3, 4
1, -2, 3, 4
-1, -2, 3, 4
1, 2, -3, 4
-1, 2, -3, 4
1, -2, -3, 4
-1, -2, -3, 4
1, 2, 3, -4
-1, 2, 3, -4
1, -2, 3, -4
-1, -2, 3, -4
1, 2, -3, -4
-1, 2, -3, -4
1, -2, -3, -4
-1, -2, -3, -4

This returns the kth permutation according to your scheme:

IEnumerable<int> Perm(IEnumerable<int> source, int k)
{
    return source.Select((x, i) => ((k >> i) & 1) == 1 ? -x : x);
}

Example:

var data = new[] { 1, 2, 3, 4 };

for (int k = 0; k < (1 << data.Length); k++)
{
    Console.WriteLine(string.Join(", ", Perm(data, k)));
}

Output:

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