我有一个简单的递归程序来查找给定字符串的所有不同的排列。我使用递归函数go()
来计算排列并使用List<char[]>
来存储permations。在计算之后,该函数检查List<char[]>
中是否已存在排列。如果没有,则会将其添加到列表&lt;&gt;中。
现在问题就在于,排列的计算得到了完美的计算,但是当我尝试将它们添加到列表中时,它并没有添加当前值。这是添加的代码。
List<char[]> l;
public void go(char[] list, int k, int m)
{
if (k == m)
{
Console.WriteLine(list); //print to check
l.Add(list); //add it to the list
}
// more code
}
现在 input = ABC ,我得到以下输出..
ABC
ACB
BAC
BCA
CBA
CAB
这是正确的,因为我直接打印它。但是当我打印清单时,我明白了。
ABC
ABC
ABC
ABC
ABC
ABC
现在我知道我在某处犯了一个简单的错误,但我无法弄清楚是什么。我已经尝试过一系列不同的方式,但似乎没有任何工作,我在互联网上找不到任何答案。 Here is the complete code
答案 0 :(得分:1)
答案已经在您的问题的评论中给出,您遇到的问题是在这一行:
l.Add(list); //add it to the list
您要在“l”列表中的“list”数组中添加引用,而不是对数组进行复制。所以基本上你留下了一个列表,其中包含对同一个对象的引用。
尝试更改此
List<char[]> l;
到这个
List<string> l;
并切换此代码
l.Add(list); //add it to the list
这个
l.Add(new string(list)); //add it to the list
而且我认为你会得到预期的结果。 不同之处在于我们已将数组(即引用类型)转换为字符串(其行为类似于值类型)