2014-10-08 244 views
0

我有這些數據C#遞歸循環

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

我想要的功能等,generateString(1) 如果值爲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,這是我認爲不是一個更好的主意。

有什麼建議嗎?

+1

如果你做了遞歸,它會是什麼樣子?你嘗試過什麼嗎? – 2014-10-08 10:22:25

+0

在嘗試之前,您可能會嘗試研究遞歸是什麼。請求其他人爲您嘗試。 – 2014-10-08 10:24:55

回答

0
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: 
      ...... 
+0

它確實有效!但我想要使用已生成的每一個字符串。如果我要使用generateString(20),我的電腦就會崩潰,因爲它無法處理存儲到一個變量的大數據。 – user3898263 2014-10-08 11:45:01

+0

您可以嘗試使用非遞歸版本。和懶惰的迭代器 – talex 2014-10-08 14:37:57

0

它看起來像成才這樣

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和列表構造函數,但在總體思路所示