2012-02-05 5 views
2

연습 문제로, 아래 코드 블록은 문자열을 반복적으로 탐색하고 "x"문자를 모두 제거하려고합니다. 그것은 그렇지만 메서드의 매개 변수로 전달하지 않고 newStr을 추적하고 싶습니다. 메서드 본문으로 옮길 수 있습니까?Java에서 문자의 재귀 제거

감사합니다.

public static String deathToX(String str, String newStr) { 
    //look for x char 
    if(str.substring(0, 1).equals("x")) { 
     //do nothing 
    } else { 
     //add non-x char to newStr 
     newStr += str.charAt(0); 
    } 

    if(str.length() == 1) { 
     return newStr; 
    } 

    return deathToX(str.substring(1), newStr); 
} 

public static void main(String[] args) { 
    System.out.println("Return: " + deathToX("xnoxmore", "")); 
} 
+0

이것은 숙제인가요? 문제에 대한 접근 방식에 제약이 없다면이 작업을 수행하는 더 쉽고 효율적인 방법이 많이 있습니다. –

+0

아니요, 숙제가 아닙니다. 나는 단지 재귀 적 방법을 쓰는 것을 연습하려고 시도하기 때문에 제한은 스스로 부과된다. 재귀 적 방법으로 작성하지 않으면 해결하기가 훨씬 쉽다는 것을 알고 있습니다. – gryb

답변

6

글쎄, 당신의 코드를 변경할 수 있습니다 :

public static String deathToX(String str) 
{ 
    // Termination case 
    if (str.length() == 0) 
    { 
     return str; 
    } 
    // Work out whether or not we want the first character 
    String prefix = str.startsWith("x") ? "" : str.substring(0, 1); 

    // Let the recursive call handle the rest of the string, and return 
    // the prefix (empty string or the first character) followed by the 
    // x-stripped remainder. 
    return prefix + deathToX(str.substring(1)); 
} 

인가 당신이 생각하고 물건의 종류?

물론 이것은 비효율적으로 문자열 조작을 수행하는 방법이지만 사물의 재귀 적 특성에 더 관심이 있다고 가정합니다.

+1

이 새 버전에서는'newStr'이 전혀 사용되지 않는 것 같습니다. –

+0

@ 루이스 와서 만 : Doh, yes, 나는 그것을 제거하려고했다. :) –

+0

당신의 솔루션을 편집하려고했는데 다른 사람이 그 변경을 한 것을 보았고 두 번째 편집에서'newStr'를 다시 추가했습니다. .so 나는 그것을 당신에게 맡기기로 결정했다. 그 사회적 프로토콜이 여기에 어떻게 작용하는지 나는 긍정적이지 못했습니다 ... –

1

메서드의 매개 변수로 전달하지 않고 newStr을 추적하고 싶습니다.

왜? 함수 결과 재귀 프로그래밍에서는 중간 결과를 함수에 전달하는 것이 종종 필요합니다. 내가 뭘하는 작업의 대부분을 처리하고 축적을 허용하는 기능을하고, 필요한 스타터 값이 이전 호출하는 래퍼 함수 만들 수 있습니다 : 여담으로

private static String deathToX0(String str, String newStr) { 
    // the original implementation 
} 

public static String deathToX(String str) { 
    return deathToX(str, ""); 
} 

을, 당신이 원하는하지 않을 수 있습니다 관련된 복사 때문에 중간 결과에 String을 사용하십시오. StringBuilder이 빠릅니다.

0

짧은 대답은 예 ... 일반적으로 트리 아래쪽에 재귀가있는 경우이 경우 공백이나 현재 문자의 각 레벨에서 조금씩 작업합니다. 따라서 return 문은 반복적으로 자신을 호출해야하며 트리의 맨 아래에서 각 수준의 섹션을 함께 추가하여 원하는 대답을 재구성합니다.

public static String deathToX(String str){ 
    if (!str.isEmpty()){ 
     return (str.substring(0, 1).equals("x") ? "" : str.substring(0, 1)) + deathToX(str.substring(1)); 
    }else{ 
     return ""; 
    } 
} 

public static void main(String[] args){ 
    System.out.println("Return: " + deathToX("xnoxmore")); 
} 

위의 예제에서 나는 형식을 줄여 한 줄에 모두 표시했지만 확장 할 수 있습니다. 재귀 함수가 return 문에서 반복되는 것을 볼 수 있어야하고 마지막 단계의 특별한 경우를 넣어야합니다. 이를 분리하여이 레벨 응답을 지역 변수에 입력하면됩니다. TMP는 다음을 사용 :

return tmp + deathToX(str.substring(1)); 

재귀가 낮은 사람은 그래서 당신이 행복하게 다시 당신의 방법에 복구 정보를 저장할 수 있습니다 마칠 때까지 현재 실행은 일시 정지 된 것을 의미한다 기억하십시오. 희망이 도움이 :)

관련 문제