这可能是一个递归alg的方法吗?

时间:2011-12-05 02:15:17

标签: c# loops permutation

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

根据您的方案返回 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