2011-12-17 2 views
3

재귀 개념을 이해하는 것이 매우 혼란 스럽습니다. 재귀 함수를 추적하려고합니다. 누군가 나를 도와 줄 수 있습니까?재귀 메서드 추적

public static int h(int n){ 
     if (n == 0) 
      return 0; 
     else 
      return h(n-1)+1; 
    } 

내가 생산 결과가 실제로 오는 방법을 이해 해달라고

int a = h(5); 
System.out.println(a) 

쓰기?

+1

당신이 '추적'은 무엇을 의미합니까

public static int nonh(int n) { int result = 0; for (int i = n; i > 0; i--) { result += 1; } return result; } 

희망? System.out.println ("h ("+ n + ")"); 전에 if (n == 0), 당신은 h (5)에 대한 출력으로 무엇을 기대합니까? – milan

+0

당신이 말하는 것처럼 간단한 재귀 적 방법입니다. 여기서 당신 혼란의 근원은 무엇입니까? 특별히 언급하십시오. – Lion

+0

정확히 추적하려고하는 대상은 무엇입니까? 이것은 재귀 함수의 3 가지 조건을 모두 만족시킵니다. – tarheel

답변

8

첫째, 나는 다음과 같은 링크가 당신을 도울 것입니다 생각 :

디버깅 도우미를 사용할 수 있습니다. IDE의 작동 방식을 확인하십시오. Beakpoint를 설정하고 디버거를 사용하여 프로그램을 단계별로 실행하는 방법에 대한 지침은 Google에 문의하십시오.

h 메서드에 대해 입력 한 값 (양수 또는 0 인 경우)을 반환합니다. 또한 큰 숫자 인 &은 음수가 StackOverflowError이됩니다. 작업을 알기 위해 메서드 내에서 print 문을 사용할 수 있습니다.

public static int h(int n) { 
    System.out.println("h(" + n + ")"); 
    if (n == 0) { 
     System.out.println("value: 0"); 
     return 0; 
    } else { 
     System.out.println("going down"); 
     int temp = h(n - 1) + 1; 
     System.out.println("h(" + n + ") --> " + temp); 
     return temp; 
    } 
} 

의지 출력 :

h(5) 
going down 
h(4) 
going down 
h(3) 
going down 
h(2) 
going down 
h(1) 
going down 
h(0) 
value: 0 
h(1) --> 1 
h(2) --> 2 
h(3) --> 3 
h(4) --> 4 
h(5) --> 5 

상기 출력 작업을 표시하도록 수정 될 수

h(5) 
| going down 
|----h(4) 
| | going down 
| |---h(3) 
| | | going down 
| | |---h(2) 
| | | | going down 
| | | |--h(1) 
| | | | | going down 
| | | | |----h(0) 
| | | | | | value: 0 --> return 0; 
| | | | | h(1) --> 1 --> h(0) + 1 = 0 + 1 = 1 
| | | | h(2) --> 2   h(1) + 1 = 1 + 1 = 2 
| | | h(3) --> 3    h(2) + 2 = 1 + 1 = 3 
| | h(4) --> 4     h(3) + 3 = 1 + 1 = 4 
| h(5) --> 5      h(4) + 4 = 1 + 1 = 5 

다음 방법 h의 비 재귀 버전이다. 도움이 :)

+0

당신은 저에게 비 재귀 버전의 메소드를 제안 해 주시겠습니까? 그것이 더 잘 이해하는 데 도움이 될 수 있습니다. 나는 가치 (value)가 0이 될 때까지 이해했으며, 다른 라인들은 어떻게 인쇄 되었는가? – Subash

+1

@subash 답변을 편집하여 자세한 내용을 표시하십시오. – Jomoos

4

디버거에서이 재귀 호출을 추적하려면 if 문에 중단 점을 설정하고 프로그램을 실행하십시오. 중단 점에 도달하면 :

  • n의 값, 호출 스택 창에서
  • 봐를 검사합니다.

호출 스택의 항목 수는 재귀 호출마다 증가합니다. n 값이 1 감소합니다. 통화가 여러 단계에 걸쳐있을 때 통화 스택에서 다른 항목을 클릭하십시오. 전화 사이트로 연결됩니다 (예 : return h(n-1)+1). 이 스택 레벨에서 n의 값을 검사 할 수 있습니다.

+0

을 사용하면 훨씬 명확합니다. 하지만 int * = h (5); System.out.println (a) * 왜 5를 반환합니까? – Subash

+0

재귀 메서드가 전달 된 값을 반환하기 때문에 h (0)은 0을 반환하고 h (1)은 0 + 1을 반환하고 h (2)는 0 + 1 + 1을 반환합니다. – dasblinkenlight

+0

감사합니다. 나는 그것을 가지고 있습니다 ... – Subash

3

로깅을 시도하십시오. 또는, 음, 단지 디버그 - 인쇄 :

public static int h(int n){ 
    System.out.println("called h(" + n + ")"); 
    if (n == 0) { 
     System.out.println("we know the result for 0, returning 0"); 
     return 0; 
    } else { 
     System.out.println("we don't know the result, calling for " + (n-1)); 
     int t = h(n-1); 
     System.out.println("Found the result for " + (n-1) + 
          ", calculating the result for " + n); 
     return t + 1; 
    } 
} 

n = 4를 들어, 당신은 얻을 것이다 :

called h(4) 
we don't know the result, calling for 3 
called h(3) 
we don't know the result, calling for 2 
called h(2) 
we don't know the result, calling for 1 
called h(1) 
we don't know the result, calling for 0 
called h(0) 
we know the result for 0, returning 0 
Found the result for 0, calculating the result for 1 
Found the result for 1, calculating the result for 2 
Found the result for 2, calculating the result for 3 
Found the result for 3, calculating the result for 4 

은 당신에게 단서를주지 희망 - 어떻게되는지, 다른 알고리즘을 재생할 수 있습니다.

또한 h(-1)을 호출하여 재미있게 사용해보십시오. 당신은 재귀의 개념을 이해하는데 어려움이있는 경우 모든

관련 문제