我有以下用c#编写的代码。我在其中打印字符串的排列。
void Main()
{
RecPermute("", "abc");
}
void RecPermute(string soFar, string rest) {
if (rest == "") {
soFar.Dump();
} else {
for(int i=0; i<rest.Length; i++) {
string next = soFar + rest[i];
string remaining = rest.Substring(0, i) + rest.Substring(i+1);
RecPermute(next, remaining);
}
}
}
现在我改变方法的签名如下。
List<string> RecPermute(string soFar, string rest)
并更改代码
List<string> RecPermute(string soFar, string rest) {
List<string> result=new List<string>();
if (rest == "") {
//soFar.Dump();
result.Add(soFar);
} else {
for(int i=0; i<rest.Length; i++) {
string next = soFar + rest[i];
string remaining = rest.Substring(0, i) + rest.Substring(i+1);
RecPermute(next, remaining);
}
}
return result;
}
问题是我没有得到任何结果。
答案 0 :(得分:1)
您有List<string> result=new List<string>();
作为本地变量。这就是你想要的
List<string> result=new List<string>(); // NOT LOCAL!!!
List<string> RecPermute(string soFar, string rest) {
if (rest == "") {
//soFar.Dump();
result.Add(soFar);
} else {
for(int i=0; i<rest.Length; i++) {
string next = soFar + rest[i];
string remaining = rest.Substring(0, i) + rest.Substring(i+1);
RecPermute(next, remaining);
}
}
return result;
}
请注意,使用类级变量来存储结果并不是一个坏主意。我仅以此为例说明当结果是本地时 - 它不会填充数据。
阅读此答案的评论 - 这个问题有不同的解决方案,我个人最喜欢的是to use a parameter:
private List<string> RecPermute(string soFar, string rest, List<string> tmp = null)
{
if (tmp == null) tmp = new List<string>();
if (rest == "")
{
//soFar.Dump();
tmp.Add(soFar);
}
else
{
for (int i = 0; i < rest.Length; i++)
{
string next = soFar + rest[i];
string remaining = rest.Substring(0, i) + rest.Substring(i + 1);
RecPermute(next, remaining, tmp);
}
}
return tmp;
}