2015-01-02 2 views
2

대체 방법을 사용하는 대신 재귀 적으로이 문제를 해결할 수 있습니까? 재귀 적 방법을 더 잘 사용하려고 노력 중입니다.코딩 박쥐 재귀 연습 (java)

문자열이 주어지면 모든 소문자 'x'문자가 'y'문자로 변경된 새 문자열을 재귀 적으로 (반복 없음) 계산하십시오.

changeXY("codex") → "codey" 
changeXY("xxhixx") → "yyhiyy" 
changeXY("xhixhix") → "yhiyhiy" 

나는 사기와 이런 식으로 해결하고 자바 문자열 방법에 대한 소스 코드를 볼려면 바꾸기를 시도하지만 난 그것을 이해하지 못했다. 내 방법이있다.

public String changeXY(String str) { 
    int len = str.length(); 
    int i = 0; 
    String changedStr = str.replace("x","y"); 


    if (len == 0) 
    return str; 

    return changedStr; 

} 

재귀 적 방법을 수행하는 방법에 대한 아이디어가 있으십니까?

다음 중 하나를 수행하는 방법을 알지 못했다는 보너스 연습이 있습니다. 도와 줘서 고마워 !!!

문자열이 주어지면 모든 'x'문자가 제거 된 새 문자열을 재귀 적으로 계산하십시오. 재귀를 중지

시킨 상태 :

noX("xaxb") → "ab" 
noX("abc") → "abc" 
noX("xx") → "" 
+0

시도해 보셨습니까? 귀하의 비 재귀 솔루션 외에도. – jrubins

+0

너무 잘 모르겠지만'if (str.contains ("x")) {string result = changeXY (str.substring (1, str.length())}'? 그리고 changeXY 그것을 변경하려면 첫 번째 숯불에 보이는가요? –

+0

나는 꽤 가까웠다? –

답변

4

재귀는 거의 항상 두 가지로 구성되어있다.

으로 가정하면이 가정을 사용하여 현재 문제를 해결하는 작은 문제를 해결할 수 있습니다.

public String changeXY(String str) { 

    // when to stop 
    if (str.length() == 0){ 
    return str; 
    } 

    // handle the "special case" using an assumption we can solve str.substring(1) 
    if (str.charAt(0) == 'x'){ 
    return 'y' + changeXY(str.substring(1)); 
    } 
    // handle the "simple" case using an assumption we can solve str.substring(1) 
    return str.charAt(0) + changeXY(str.substring(1)); 
} 

다른 운동은 어떻게 작동하는지 쉽게 알 수 있습니다.

+1

고맙습니다! 일단 컨셉을 이해하면 다른 문자열 재귀 메소드가 쉽다는 것에 동의합니다. 필자는 일반적으로 이클립스 디버거를 통해 더 잘 이해하고있다. 시간 내 주셔서 다시 한번 감사드립니다. – Sankofa

+0

몇 분 후에 수표를 드리겠습니다. – Sankofa

2

의사 :

changeXY(input) { 
    if (input.isEmpty()) return ""; 
    head = "firstChar"(input); 
    tail = "theRest"(input); 
    return (head == 'x' ? 'y' : head) + changeXY(tail); 
    } 


    noX(input) { 
    if (input.isEmpty()) return ""; 
    head = "firstChar"(input); 
    tail = "theRest"(input); 
    return (head == 'x' ? '' : head) + noX(tail); 
    } 

당신이해야 할 적절한 자바 API 대신 "firstChar"와 "theRest"을 구현하거나 호출하는 것입니다.

public String changeXY(String str) { 
     int len = str.length(); 
     String changedStr = ""; 
     for(int i=0; i<len; i++){ 
      if(str.charAt(i) == 'x'){ 
       changedStr+="y"; 
      }else{ 
       changedStr+=str.charAt(i); 
      } 
     } 

     if (len == 0) 
     return str; 

     return changedStr; 

} 

그것은 "X"의

, Y에 대한 변경이 문자열이 종료 될 때까지 :

0

먼저 운동) 나는 케이크의 조각이 될 것으로 판단된다.

더 쉬운 두 번째 연습은 changedStr+="y" 부분을 continue 자바 명령어로 변경하기 만하면됩니다.

그러나이 코드는 초보자에게 적합하지 않습니다. 일반적으로 루프에 대한 지식이 필요합니다. 학생 인 경우 다른 답변을 확인하는 것이 좋습니다. 그들은 이해하기 쉽고 그립을 쉽게 얻습니다.

+0

고맙습니다. 나는 루프를 얻지 만 재귀를 전혀 연습하지 않았으므로 나는이 연습을 그들없이 풀려고 노력하고있다. – Sankofa

+0

이것은 재귀가 아니므로 "이 문제를 재귀 적으로 어떻게 해결할 수 있습니까?"라는 질문에 대답하지 않습니다. 또한 부정확 한 정보를 제공합니다. 이것은 "for-loop에서의 재귀"가 아니라고 주장합니다. 나는 무례하거나 아무것도하려고하지는 않지만,이 대답은 오류와 부정확성을 포함합니다. –

+0

Very True @CodyS – Sankofa

2

재귀는 두 가지를 기반으로합니다 : 1- 기본 경우 : 특정 조건에 따라 메서드가 자체 호출을 중지합니다. 2 연산 :이 메서드로 수행 할 작업 + 해당 인수를 변경하여 메서드를 다시 호출 베이스 케이스에 도달한다. 이 경우 다음을 수행해야합니다.

public String changeXY(String string){ 

    string = string.toLowerCase(); 
    if(string.length()==0) 
    { 
     return string; 
    } 
    else if (str.charAt(0) == 'x') 
    { 
     return 'y' + changeXY(str.substring(1)); 
    } 

    return str.charAt(0) + changeXY(str.substring(1)); 
} 
+0

인덱스가 더 이상 없다면 어떻게 changeXY (str.substring (1)) outOfBounds 오류가 발생하지 않습니까? – Sankofa