2011-11-14 2 views
1

우선이 것은 숙제가 아닙니다. 그냥 연습하고있어. 주어진 문자열에 "hi"가 나타나는 횟수를 재귀 적으로 결정하려고 시도하지만 모든 경우에 마지막 else if 문과 문자열이 비어있는 항목으로 건너 뜁니다. 어떤 아이디어?자바 재귀 횟수

기본적으로, 는 "안녕하세요"그냥 계산 1 증가 수 (문자열이 "안녕하세요"로 시작)와 스킵 2 인덱스 이후의 문자열로 재귀 경우 다른

(문자열하지 않는 경우 "hi"로 시작하고 문자열이 비어 있지 않음) 다음 번에 "hi"로 시작하는지 알아보기 위해 첫 번째 인덱스 다음에 문자열을 재귀 적으로 사용하십시오.

else if (문자열이 비어있는 경우) 인쇄 ("텍스트의 끝에 도달 함") return count;

public class Practice { 

    public int recur(String str, int counter){ 
     int count=counter; 
     if(str.startsWith("hi")){ 
      count++; 
      recur(str.substring(2),count); 
     } 
     else if((!str.isEmpty())&&(!str.startsWith("hi"))){ 
      recur(str.substring(1),count); 
     } 
     else if(str.isEmpty()){ 
      System.out.println("End of text reached"); 
      return count; 
     } 
     return count; 
    } 

    public static void main(String args[]){ 
     String str="xxhixhixx"; 
     Practice p=new Practice(); 
     System.out.println(p.recur(str, 0)); 
    } 
} 
+2

문자열 처리 [wiki] (http://en.wikipedia.org/wiki/Recursion_%28computer_science%29#Recursive_procedures)보다 재귀 연습에서 시작하는 것이 더 좋은 예가 있습니다. – PeterMmm

+0

나는 이것에 문제가있다.'counter '가 외부 호출의 일부이기 때문에 호출자가 결과를 수정할 수있다. 최소한 이것은'private'으로 만들어 져야합니다.'public' 래퍼는'counter'를 포함하지 않습니다. (재귀 적이 아닙니다.) 다른 방법은 재귀 복귀 중에 추가 작업을 수행하는 것입니다.또한, 당신은'startsWith'로 확인한 다음, 커서를 1 씩 옮긴다.'indexOf'의 문제점 (더 나은 최적화가 가능하다.) –

답변

2

당신 재발에서 반환 된 값을 사용하고 있지 않습니다.

7

이것은 재귀 함수 호출 디버깅을 연습 할 수있는 좋은 기회입니다. 실제로는 꽤 어렵습니다. 제안 :

  • 사용이 전략적으로 인수가 다음
  • 리팩토링 더 명확하게 할 수있는 경우 문에서 대소 분석의 순서로 하나의 재귀 호출에서 제대로 변경되는 것을 보장하기 위해 인쇄 문을 배치 . 예를 들어, 1) 문자열이 비어 있는지 확인합니다 (2) 문자열이 "hi"로 시작하는지 확인합니다. 3) catch-all - 비어 있지 않고 "hi"로 시작하지 않습니다.
+0

전략적으로 배치 된 print 문에 관해서는, 여기에서 볼 수 있듯이, 인쇄를 재귀 깊이와 "정렬"하는 것이 좋습니다. http://stackoverflow.com/questions/7774769/how-do-i-solve-the -classic-knapsack-algorithm-recursively/7775224 # 7775224 – TacticalCoder

+0

@ user988052 - 재귀적인 문제가 있으면 도움이 될 수 있지만 나무가 관련된 경우에는 더 유용합니다. 이것은 '선형'재귀 문제이므로 도움이되지 않습니다. –

4

@ Steve가 언급했듯이 recur이 반환하는 반환 값을 사용해야합니다. 코드의 수정 된 버전은 아래를 참조하십시오

, 나는 또한 당신의 경우/다른 문을 단순화 :

public int recur(String str, int counter) { 

    if (str.startsWith("hi")) { 
    return recur(str.substring(2), counter+1); 
    } else if (!str.isEmpty()) { 
    return recur(str.substring(1), counter); 
    } else { 
    System.out.println("End of text reached"); 
    return counter; 
    } 
} 

public static void main(String args[]) { 
    String str = "xxhixhixx"; 
    Practice p = new Practice(); 
    System.out.println(p.recur(str, 0)); 
} 
+0

올바른 해결책입니다. 무슨 일이 있었는지 최상위 함수 호출이 재귀 호출의 반환 값으로 아무 것도하지 않았으므로 0을 반환하는 마지막 return 문을 치는 것입니다. –

+0

오우 나는 지금 기억한다. 도와 줘서 고마워. 재귀 롤을 사용한 이후로 꽤 오래되었습니다. – user1045873

1

여러분의 프로그램 인쇄 '텍스트의 끝'마지막 논리에 따라 거기에 도달 할만큼 정확 , count가 항상 0으로 오는 이유는 모든 반복에서 자신의 복사본을 변경하고 마침내 종료 조건에 도달하면 (String은 비어 있음) 결과가 스택에서 튀어 나옵니다. 따라서 최종 결과는 count가 0 인 첫 번째 반복이므로 count를 반환하는 대신 모든 단계에서 recur가 반환 한 값을 반환해야합니다.

-1
public static int recursive(String givenStr) { 

    int count =0 ; 

    Pattern pattern = Pattern.compile("hi"); 
    Matcher match = pattern.matcher(givenStr); 
    while(match.find()){ 
     System.out.println(match); 
     count++; 
    } 
    return count; 
} 

이 횟수를 반환은 "안녕하세요"문자열

2
public int countHi(String str) { 
     if (str.length() <= 1) { 
     return 0; 
     } 
     int count = 0; 
     if (str.substring(0, 2).equals("hi")) { 
     count = 1; 
     } 
     return count + countHi(str.substring(1)); //substring off 
    } 

에 나타난이 모든 재귀 적으로 더 큰 문자열 내부의 문자열 "안녕하세요"의 수를 계산한다 않습니다. 구현의 나머지 부분은 케이크, 행복 코딩해야합니다!