2013-03-10 2 views
2

나는 재귀 방법은 문자 "E"는 주어진 문자열에 나타납니다 얼마나 많은 경우 계산이 노력하고있어. 내 테스트 문자열은 Count my e's please!입니다.StackOverflowError가 재귀 메소드

내가 코드를 디버깅
public static int showE(String s, int count, int index) 
{ 
     if (index == -1) return count; 
     String e = "e"; 
     int i = s.indexOf(e, index); 
     if (i != -1) count ++; 
     return showE(s, count, i); 
} 

, int i 대신 각각의 호출을 통해 증가의 9에 남아있을 것입니다 : 여기에 지금까지 코드입니다.

그 코드의 마지막 줄은 입력으로 int i을 사용했기 때문에 테스트 문자열에 대한 각 호출을 통해 메소드의 서명에 int index을 9, 15 및 18로 설정한다고 생각했습니다. 편지 전자가 더 이상 발견 된 후, 나는 int i 보낼 것이라고 -1로 서명 생각하지, 다음 int count 다시 main 메소드에 리턴됩니다. 그러나 디버깅을 통해 int i은 StackOverflowError로 이어지는 각 호출을 통해 9로 설정됩니다. 이 문제를 어떻게 해결할 수 있습니까?

편집 :

public static int showE(int count, int index) 
{ 
     String e = "e"; 
     index = s.indexOf(e, 0) 
     for(int i = index; i = < s.length() - 1; i++) 
     { 
      if (index == e) count++; 
     } 
     return count; 
} 
+1

거의 항상 문제의 정지 조건. –

+0

왜 재귀 적 방법을 사용합니까? – Rob

+0

@Rob : 루프가 이해하기 쉽기 때문에 OP가 재귀를 실험하고 있다고 가정합니다. – Ash

답변

7

String.indexOf 당신이 제공하는 인덱스 검색을 시작 :이 형식에 대한 죄송 스티븐 C.에 응답 코드입니다. 반환

9. index + 1에서 같이 IndexOf를 시작하려고 때문에 그래서, 인덱스 (9)에서 검색을 시작하고, 거기에 '전자'를 찾습니다.

+0

+1하지만 결과는 * e의 수 +1입니다 (abcde의 경우 1 대신 2를 반환합니다). ' – Maroun

+0

@MarounMaroun 아니, 검색의'자체는 변경되지 않습니다 count' 만 시작 인덱스 1 - 이제 반환 대가 수 '있어야한다. –

+0

사실 저는'index + 1 '로 프로그램을 작성했습니다. 나는 다른 오류를 고치려고 출격 한 것으로 생각한다. 너를 칭찬하고 동시에 나 자신을 차고. 고마워. – rice2007

0

두 지점 :

  • 에만 showE 방법이 개 인수를 필요로이 문제에 대한 더 우아한 재귀 솔루션이 있습니다. 힌트 : 자바에서 문제

  • 재귀 솔루션은 고유의 문제가 ... 재귀 호출의 결과에 무언가를 추가하는 생각. Java 스택은 항상 유한하며 Java는 마무리 호출 최적화를 구현하지 않습니다. 이 두 가지를 결합하면 정말 깊은 재귀를 필요로하는 모든 문제가 스택 오버 플로우로 이어질 수밖에 없습니다. 이 경우

    , 이것은 당신이 충분히 긴 문자열의 E 년대를 계산하려고하면, 당신은 당신이 재귀가 올바른 얻을 경우에도 ... 예외가된다는 것을 의미합니다.

+0

이것은 가능한 경우 재귀에서 벗어나려고 시도하는 구체적인 이유입니다. 그러나 이전에 말했듯이, 나는이 회귀성 재귀 킥을 최근에 보았습니다. 나는이 2 가지 논쟁을 시도 할 것이다. 네가 나를 다시 보게되면 나는 성공했다. – rice2007

+0

두 개의 인수만으로 호출을 수행하는 방법을 알아 냈다고 생각합니다. 나는 사실 함께 모든 재귀를 피하기 위해 제 3의 솔루션에 노력하고있어. look-see와 2 매개 변수, 재귀 적 솔루션을 가져보십시오. 답변에 대한 질문 편집을 참조하십시오. – rice2007

관련 문제