2014-01-19 43 views
1

我有一个字符串ABC,我试图用递归获取它的所有形式。例如,我的目标是使输出看起来就像这样:递归获取字符串的形式

A 
B 
C 
AB 
AC 
BC 

目前,我遇到一个问题,我似乎无法弄清楚它为什么这样做。当我遍历我的代码并到达return temp时,它会回到Passwords(word.Substring(start + 1, end - 1), start + 1, end);,即使该功能已经完成。当它这样做时,它将删除包含在我的列表中的任何元素。

class Program 
    { 
     static void Main(string[] args) 
     { 
      string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\words.txt"; 
      string text = "abc"; 
      List<string> passwords = Passwords(text, 0, text.Length); 

      foreach (string password in passwords) 
      { 
       using (StreamWriter writer = new StreamWriter(path)) 
       { 
        Console.WriteLine(password); 
        writer.WriteLine(password); 
       } 
      } 
     } 

     public static List<string> Passwords(string word, int start, int end) 
     { 
      List<string> temp = new List<string>(); 
      if (start == end) 
      { 
       temp.Add(word); 
      } 

      else if (word.Length == 2) 
      { 
       char[] input = word.ToCharArray(); 
       string letter1 = input[0].ToString(); 
       string letter2 = input[1].ToString(); 
       string s = letter2 + letter1; 
       temp.Add(s); 
      } 

      else 
      { 
       if (start < end) 
       { 
        Passwords(word.Substring(start + 1, end - 1), start + 1, end); 
       } 
      } 

      return temp; 
     } 
    } 

任何人都可以帮助指出我在正确的方向,我做错了什么?

+1

应该有不少“如何生成XXXXX的所有排列”的问题......这里有一些[非递归(http://stackoverflow.com/questions/11208446/generating-permutations-of- a-set-most-efficient)...和[FAQ:重新排列字符串中的字符的C#算法](http://stackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of -k元素-从-N)。 –

回答

3

这听起来像你想从你的源文本字符掉落的每一个组合。您不想重新排列,只需返回所有按顺序的子集。

如果是这样,这可能会做你想要什么:

public IEnumerable<string> GetAllInstrings(string text) 
{ 
    yield return text.Substring(0, 1); 
    if (text.Length > 1) 
    { 
     foreach (var element in GetAllInstrings(text.Substring(1))) 
     { 
      yield return element; 
      yield return text.Substring(0, 1) + element; 
     } 
    } 
} 

我得到下面的结果从 “ABC”。

A 
B 
AB 
C 
AC 
BC 
ABC 
+0

谢谢,那正是我想要做的。我想办法解决这个问题。 – tylerbhughes

3

主要问题我可以看到你的递归调用:你根本不存储这个调用的结果!你应该将它们添加到列表temp

temp.AddRange(Passwords(word.Substring(start + 1, end - 1), start + 1, end)); 

但是整个代码看起来很乱,所以我不知道这将使它的工作,因为它可能不是唯一的问题。

+0

+1 ...也看起来应该不仅仅是添加通话结果(缺少前缀)。 –

+1

@AlexeiLevenkov我很确定整个算法是不正确的。我不认为当你已经发送缩小的单词时,你应该增加'start' /'end'!但正如你在评论中所说的那样,关于这个算法问题有很多问题,所以我不打算深入。 – MarcinJuraszek

0

有很多关于如何做到这一点的例子。

我会考虑检查那些并重构你的代码,因为我认为它需要一些更改(如@Alexei Levenkov说 - 你有返回值的问题)。

您可以检查this example如何做到这一点,和好解释here