作为参数的循环递归数

时间:2014-01-09 14:30:43

标签: c#

我正在构建一个包含2个字母字符串的所有排列的字符串列表,例如“aa”到“zz”。这就是我所拥有的:

public List<string> SomeMethod(int NumberOfChars) {

    for (var i = 0; i < 26; i++)
    {
        char character1 = (char)(i + 97);
        var Letter1 = character1.ToString();

        for (var j = 0; j < 26; j++)
        {
            char character2 = (char)(j + 97);
            var Letter2 = character2.ToString();

            string TheString = Letter1 + Letter2;
            TheList.Add(TheString);
        }
    }

    return TheList;
}

基本上,它是一个循环内部的循环,它结合了字母表中的字符。现在假设我想包含NumberOfChars作为确定每个字符串长度的参数。例如,如果我传入2,它将返回从"aa""zz"的所有676个双字母字符串,如果我传入3,它将从"aaa"返回所有17,576个3个字母的字符串到"zzz"

目前,最简单的方法是使用两种不同的方法,一种返回带有两个嵌套循环的双字母字符串,另一种返回带有3个嵌套循环的3字母字符串。

这样做更干净的方法是什么?

感谢。

2 个答案:

答案 0 :(得分:15)

这样的方法怎么样:

public IEnumerable<string> SomeMethod(int NumberOfChars) 
{
    if (NumberOfChars == 0)
    {
        yield return string.Empty;
    }
    else 
    {
        for (var i = 'a'; i <= 'z'; i++)
        {
            foreach (var s in SomeMethod(NumberOfChars - 1)) 
            {
                yield return i + s;
            }
        }
    }
}

只是为了好玩,这是使用Linq的另一个解决方案:

public IEnumerable<string> SomeMethod(int n) 
{
    var r = Enumerable.Range('a', 26).Select(x => ((char)x).ToString());
    return (n > 1) ? r.SelectMany(x => SomeMethod(n - 1), (x, y) => x + y) : r;
}

答案 1 :(得分:2)

这是一个使用循环而不是递归的替代方法:

public static List<string> SomeMethod(int numberOfChars)
{
    IEnumerable<string> results = new List<string> { "" };

    for (int i = 0; i < numberOfChars; ++i)
        results = from s in results
                  from c in Enumerable.Range('a', 26)
                  select s + (char)c;

    return results.ToList();
}