2012-05-01 3 views
3

다음은 Java의 재귀 적 정적 메서드입니다.단순 재귀 설명

public static int mystery(int m, int n) { 
    int result = 1; 

    if (m > 0) { 
     result = n * mystery(m-1, n); 
    }  

    System.out.println (m + " " + result); 
    return result; 
} 

미스터리 (3,4)를 호출하면 표준 출력에 무엇이 출력됩니까? 신비에 대한 호출에서 최종 반환 값은 무엇입니까 (3,4)?

표준 출력 부품에 대한 설명에 대한 설명은 무엇입니까?

출력 :

0 1 
1 4 
2 16 
3 64 

최종 리턴 값은 64

+3

당신의 생각은 지금까지 무엇입니까? –

+0

이게 당신의 숙제입니까? – bfontaine

+1

아니요,이 예제를 통해 재귀를 이해하려고합니다. – JavaStudent12344

답변

5

는 (모든 의도와 목적을 위해 인) n 고정으로 간주하고 f(m)mystery(m,n) 수 있도록한다.

그런 다음

f(0) = 1 
f(1) = n * f(0) = n 
f(2) = n * f(1) = n * n 
f(3) = n * f(2) = n * n * n 

당신은 일반적인 패턴을 볼 수 있을까요? f(n)의 마감 된 양식을 제공 할 수 있습니까?

1

이 샘플은 m을 전원 n으로 계산합니다. 따라서 귀하의 경우 값은 64입니다.

그러나 귀하는 귀하의 분석을 시도 했습니까?

public static int mystery(int m, int n) { 
int result = 1; 

if (m > 0) { 
    result = n * mystery(m-1, n); 
}  

System.out.println (m + " " + result); 
return result; 
} 

당신의 코드를 감안할 때

2

는 m = 3, N = 4로 시작하자,

mystery(3,4){ 
    int result = 1 
    if(3 > 0){ 
     result = 4 * mystery(3-1,4); 
     //We proceed from this point only after evaluating mystery(2,4) 
     mystery(2,4){ 
      int result = 1 
      if(2 > 0){ 
       result = 4*mystery(2-1,4); 
       //Now we have to evaluate mystery(1,4) 
       mystery(1,4){ 
        int result = 1; 
         if(1 > 0){ 
          result = 4*mystery(1-1,4); 
          //Evaluate mystery(0,4) 
          mystery(0,4){ 
          int result = 1; 
          if(0 > 0){ 
           //Not evaluated 
          } 
          System.out.println(0 + " "+1); 
          return 1; 
          }...mystery(0,4) done continue with evaluation of mystery(1,4) 
          result = 4*1 //1 is what is returned by mystery(0,4) 
          System.out.println(1+ "" + 4); 
          return 4; 
         }//done with the evaluation of mystery(1,4), resume evaluation of mystery(2,4) 
       result = 4*4 //4 is the value returned by mystery(1,4) 
       System.out.println(2 + " " + 16); 
       return 16;    
       }//At this point we are done with evaluating (2,4) and on the way to resume evaluation of mystery(3,4) 
     result = 4 * 16 
     System.out.println(3 + " "+ 64) 
     return 64; 
     } 
    } 

희망이 ... 디버거로 시도하여 그것을 모방하려고 할 수 있습니다 도움

0

첫 번째 호출은 mystery (3,4)이며 그 다음 mystery (2,4)를 호출 한 다음 mystery (1,4)를 호출 한 다음 mystery (0,4)를 호출합니다. 이 예제에서 기본 경우는 신비 (0,4)입니다. 즉, m> 0은 false로 평가되고 result = n * mystery (m-1, n)은 실행되지 않습니다 (여기서 재귀가 종료됩니다). 기본 케이스가 호출 스택 맨 위에 있고 스택의 맨 아래가 신비합니다 (3,4). ... 바닥쪽으로 호출 스택의 상단에서 평가

enter image description here