把它变成递归算法的可能方法
本文关键字:方法 递归算法 | 更新日期: 2023-09-27 18:16:34
我试图有一个数组与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);
我注意到有些部分重复。有没有办法把这个写进循环?谢谢。
这将根据您的方案返回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,41 -2 3 4- 1,2,3,41 2 -3 4-1 2 -3 41 -2 -3 4-1 -2 -3 41 2 3 -4- 1,2,3, -41 -2 3 -4- 1,2,3, -41 2 -3 -4- 1,2,3, -41 -2 -3 -4- 1,2,3, -4