繁体   English   中英

C#递归循环

[英]C# recursive loop

我有这些数据

string [] letters = {"a","b","c"};

我想要一个类似generateString(1)的函数,如果value为1,则输出为:

a
b
c

如果generateString(3),则输出为

a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
aac
aba
abb
abc
aca and so on...

我可以这样

foreach(var a in data){
 foreach(var b in data){
  foreach(var c in data){
    Console.WriteLine(a + b + c);
  }
 }
}

它最多只能生成3,如果我想使其达到4,则我要添加另一个foreach,这是我认为不是一个更好的主意。

有什么建议么?

看起来像这样

List<List<String>> foo(int i){
    if(i==1){
        return new List<List<String>>(new List<String>("a", "b", "c"));
    } else{
        var result = new List<List<String>>();
        foreach(List<String> list in foo(i-1)){
            foreach(String elem in new String[]{"a", "b", "c"}){
               var tmp = new List<String>(list);
               tmp.Add(elem);
               result.Add(tmp);
            }
        }
        return result;
    }
}

我不确定sintax和list构造函数,但总的来说是这样

static string[] generateString(string[] letters, int len)
{
    if (len < 0) throw new ArgumentOutOfRangeException("length can't be less than zero.");
    switch (len)
    {
        case 0: return new string[0];
        case 1: return letters;
        default:
            // all possible combinations which are shorter than required 
            // recursion is used here
            var shorter_x = generateString(letters, len - 1).ToArray();

            // all combinations which have length = len - 1
            var shorter_1 = shorter_x.Where(line => line.Length == len - 1).ToArray();

            // resulting array
            return shorter_x.Union(letters.SelectMany(letter => shorter_1.Select(shorter => letter + shorter))).ToArray();
    }
}

UPD:将数据表示为

char[] letters = { 'a', 'b', 'c' }

会更加一致。 在这种情况下,该功能看起来像

static string[] generateString(char[] letters, int len)
{
    if (len < 0) throw new ArgumentOutOfRangeException("length can't be less than zero.");
    switch (len)
    {
        case 0: return new string[0];
        case 1: return letters.Select(char.ToString).ToArray();
        default:
            ......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM