2014-01-19 2 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- 가장 효율적인 집합) ... 및 [FAQ : 문자열에 Chars를 재 배열하는 C# 알고리즘] (http://stackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of -k-elements-from-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 전 알고리즘이 틀렸다는 것을 확신합니다. 이미 축소 된'word'를 보낼 때'start' /'end'를 증가시켜야한다고 생각하지 않습니다! 그러나 귀하의 의견에서 말했듯이, 알고리즘 문제에 대한 많은 질문이 있습니다. 그래서 더 깊이 파헤 치지 않을 것입니다. – MarcinJuraszek

0

이렇게하는 방법에 대한 예제가 많이 있습니다.

@Alexei Levenkov가 말했듯이, 변경 사항이 필요하다고 생각하기 때문에 코드를 검사하고 리팩토링하는 것이 좋습니다. 반환 값에 문제가 있습니다.

당신은 당신이 당신의 원본 텍스트에서 문자를 삭제의 모든 조합을 원하는 것 소리 그렇게하는 방법 this example, 좋은 설명 here

관련 문제