2016-08-23 2 views
2

나는 "Think Java : 컴퓨터 과학자처럼 생각하는 법"이라는 책을 읽으며 최근에는 재귀 적 방법을 다루었습니다.재귀 Java 메서드를 반대로

public static void countdown(int n) 
{ 
    if (n == 0) { 
     System.out.println("Blastoff!"); 
    } else { 
     System.out.println(n); 
     countdown(n - 1); 
    } 
} 

이 아래로 0으로 계산하는 데 사용되는 일반적인 재귀 방법이 될 것입니다 그리고 난 무슨 일이 일어나고 있는지 이해하지만이

public static void countdown(int n) 
{ 
    if (n == 0) { 
     System.out.println("Blastoff!"); 
    } else { 
     countdown(n - 1); 
     System.out.println(n); 
    } 
} 

같은에서 System.out.println 전에 재귀 호출을 할 경우 그것은 반대의 방식으로 계산합니다. 그래서 만약이 두 가지 조건문 모두에 대해 3 번 인수를 주면 첫 번째 것은 "3, 2, 1, Blastoff"가됩니다. 그러나 제 2의 1은 "Blastoff, 1, 2, 3"이됩니다 ... 나는 이것이 어떻게 작동하는지 이해하지 못합니다. 누군가이 코드에서 일어나는 일을 설명하려고 노력할 수 있습니까?

+0

더 나은 첫 번째 방법 라인으로 println 메소드를 넣어, 어떻게 작동하는지 이해합니다. – RominaV

답변

0

"반대 방향"을 계산하지 않습니다. 예상하지 못한 순서로 "풀다"라는 것입니다. 일어날 것으로 예상되는 일을 적어보십시오. 오해를 해결하는 데 기꺼이 도와 드리겠습니다.

+0

1 초 내가 그것을 쓰게 하고이 WTF를 편집하자? 왜 저장하지 않고 엔터를 치지 않을 수 있습니까? –

+0

두 번째 함수에서 재귀 호출은 * println 이전에 발생하므로 기본 case ('n == 0'이 true 일 때)에 먼저 도달합니다. 그런 다음 이전 호출의'println'에 도달하여 반환하는 '3'을 인쇄합니다. – EntangledLoops

+0

편집 : 감사합니다. 감사합니다. 카운트 다운을 호출하고 System.out.println을 건너 뛰는 방법을 이해했습니다. 내게는 n이 0과 같으면 재귀 호출이 계속해서 카운트 업되는 방식입니다. –

0

문제는 인쇄 호출이 함수 호출이 완료 될 때까지 대기한다는 것입니다. 따라서 첫 번째 인쇄 줄에 도달하기 전에 한 번에 3 번 함수를 호출합니다.

0

모든 재귀 지점은 모든 단계에서 자체 로컬 변수가있는 자체 "스택 프레임"을 가져옵니다.

따라서 한 번의 반복에서 n을 변경하더라도이 반복을 호출 한 함수의 고유 값은 n입니다. 시간이 인쇄되면이 n은 여전히 ​​원래 값 (다음 반복의 값보다 큰 값)이됩니다.

4
그것의

생각해 이런 식으로 ... 첫 번째 경우 당신은 항상 다음 기능을 가기 전에 인쇄, 그래서 것입니다 ...에서

countdown(3) 
    System.out.println(3) 
    countdown(2) 
    System.out.println(2) 
    countdown(1)  
     System.out.println(1) 
     countdown(0) 
     System.out.println("Blastoff") 

결과 : 3 2 1 Blastoff (발사)

당신이 먼저 인쇄하기 때문에 두 번째 경우는 러닝은 ... 인쇄를 시작하는 기본 케이스까지 재귀 아래 모든 길을 갈 것입니다

countdown(3) 
    countdown(2) 
    countdown(1) 
     countdown(0) 
     System.out.println("Blastoff") 
    System.out.println(1) 
    System.out.println(2) 
System.out.println(1) 

결과 : 1 2 3 Blastoff (발사)

재귀가 어렵습니다! 나는 내가 도왔 으면 좋겠다.

9

나는 그것을 당신을 위해 시각화하려고 노력할 것이다.

첫 번째 방법

countdown(3)    (first call) 
"3"       (sysout) 
    countdown(3-1)   (second call) 
    "2"      (sysout) 
     countdown(2-1)  (third call) 
     "1"     (sysout) 
      countdown(1-1) (fourth call) 
       "Blastoff!" (n == 0) 

두 번째 방법

countdown(3)    (first call) 
    countdown(3-1)   (second call) 
     countdown(2-1)  (third call) 
      countdown(1-1) (fourth call) 
       "Blastoff!" (n == 0. going back up call stack) 
      "1"    (sysout) 
     "2"     (sysout) 
    "3"      (sysout)