查找所有排列并以List <string> </string>返回结果

时间:2013-12-02 07:32:03

标签: c#

我有以下用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;
}

问题是我没有得到任何结果。

1 个答案:

答案 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;
    }