2014-02-27 1 views
1

내 재귀 적 방법의이 부분에 대해서는 2보다 큰 짝수 길이의 문자열 (대소 문자 에서처럼)을 처리해야합니다. 내 문제는 내 재귀 사례를 실제로 기본 사례에 접근시키는 방법을 찾는 것입니다. 내가 반전 부분을 제대로 수행했는지 알지 못합니다. 스택 오버플로 오류가 발생하는 기본 사례로 인해 스택 오버플로 오류가 발생합니다. 여기에 문제의 방법이 있습니다. (. 문은 내가 가진 '가'내 현재 후 이상한 문자열을 처리 할 "는 null를,"이 순간은 그래서 홀수없이 내 경우에도 테스트 할 수 있습니다.)재귀를 사용하여 문자열의 인덱스를 반대로합니다.

편집 : 예 입력 : ABCDEF 출력 예 : EBCDAF

public static String revEven(String inString) 
    { 
     String tempString = new String(); 

     if (inString.length() <= 2) 
     return inString; 
     if (inString.length() == 3) 
     { 
     tempString += inString.charAt(2); 
     tempString += inString.charAt(1); 
     tempString += inString.charAt(0); 

     return tempString; 
     } 
     if (inString.length() % 2 == 0) 
     { 
     return revEven(inString.substring(0, inString.length() - 1) + inString.charAt(inString.length() - 1)); 
     } 
     return null; 
    } 
+0

- 아 지금 우리 이야기 달콤한하려고하지 않습니다 ... – aliteralmind

+0

하하, 나는 있었으면 좋겠다. 왜 내가 오류가 발생하는지 이해합니다. 기본 케이스에 접근하려고 시도한 모든 것이 현재 솔루션보다 훨씬 의미가 있습니다. – coinbird

+0

마지막 리턴 문에서 java.lang.StackOverflowError. 나는 그런 말을했다. 나는 또한 그것이 왜 일어나고 있는지 이해했다고 말했다. 재귀 적 메서드에 입력 한 문자열이 결코 작아지지 않기 때문에 기본 메서드를 절대 사용하지 못하기 때문에 메서드가 영원히 자신을 호출하게됩니다. – coinbird

답변

1

StackOverflowError를 얻는 이유는 재귀 호출간에 문자열이 변경되지 않기 때문입니다. 함수를 다시 호출하는 행에서 초기 문자열을 다시 작성하면됩니다.

"ABCD"= "ABC"(부분 문자열 (0,3)) + "D"(charAt (3)) - 같은 문자열입니다.

힌트. 재귀 호출에서 문자열을 변경하지 마십시오. 아마도 문자열을 문자 배열로 나타내고 재귀 호출에서 인덱스를 변경 한 다음 짝수 인덱스가 가리키는 문자를 바꿔 넣는 것이 더 좋을 것입니다.

나는 코너 케이스를 확인하지 않았지만 아이디어는 다음과 같습니다 : "나는 스택 오버플로 오류로 ..."

public static String runEven(String string) { 
    char[] array = runEvenImpl(string.toCharArray(), 0, string.length()); 
    return new String(array); 
} 

public static char[] revEvenImpl(char[] array, int head, int tail) { 
     if (head == tail) 
     return array; 
     if (head % 2 == 0 && tail % 2 == 0) 
     { 
      swap(array, head, tail); 
     } 
     revEven(array, head+1, tail-1); 
    } 
+0

정보를 제공해 주셔서 감사합니다. 내 교수는 이것을 위해 배열을 사용하지 않기로했다. 그래서 substring과 charAt 메서드를 사용하기로했습니다. – coinbird

+0

@CoinBird array/indices를 사용할 수 없다면 기본 char 배열의 인덱스에 대한 멋진 이름 인 charAt()를 사용할 수 없습니다. –

+0

죄송합니다. 각 캐릭터를 배열로 전송한다고하셨습니다. 우리는 그것을 문자열로 유지해야합니다. 문자의 전환은 문자열 연결로 수행됩니다. charAt 및 substring 메서드가 허용됩니다. – coinbird