public class Ex07_재귀호출 {
public static void main(String[] args) {
show(3); // 호출
}
public static void show(int cnt) { // 정의
System.out.println("cnt : " + cnt);
if (cnt == 1)
return; // 종료 조건
show(--cnt); // 재귀 호출
}
}
실행 과정 (호출 순서)
1. main 시작
- show(3) 호출
- → cnt=3
2. show(3) 실행
- 출력: cnt : 3
- cnt == 1? → ❌ (3이므로 통과)
- --cnt 실행 → cnt 값이 2로 감소
- show(2) 호출
show(2) 실행
- 출력: cnt : 2
- cnt == 1? → ❌ (2이므로 통과)
- --cnt 실행 → cnt 값이 1로 감소
- show(1) 호출
show(1) 실행
- 출력: cnt : 1
- cnt == 1? → ✅
- return → 메서드 종료
호출 흐름을 스택처럼 표현
main()
└─ show(3)
└─ show(2)
└─ show(1) → return
cnt : 3
cnt : 2
cnt : 1
재귀호출2
import java.util.Scanner;
public class Ex08_재귀호출 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("숫자1 :");
int num1 = sc.nextInt();
System.out.print("숫자2 :");
int num2 = sc.nextInt();
int result = recursive(num1, num2); // 메서드 호출
System.out.println("result:" + result);
}
public static int recursive(int num1, int num2) { // 메서드 정의
if(num2 ==0)
return 1;
else
return num1 * recursive(num1, num2-1);
}
}
1. main 시작
- rec(2, 3) 호출
- rec(2, 3)→ 메서드 정의로 이동
2. rec(2, 3) 실행
- if문
- num2 == 0? → ❌ (3이므로 통과)
- num1 * rec(2, 2)
- rec(2, 2) 호출
3. rec(2, 2) 실행
- if문
- num2 == 0? → ❌ (2이므로 통과)
- num1 * red(2,1)
- rec(2, 1)호출
4. rec(2, 1) 실행
- if문
- num3 == 0? → ❌ (1이므로 통과)
- rec(2, 0)호출
5. rec(2, 0) 실행
- if문
- num3 == 0? → 0 (1이므로 통과) ✅
- return = 1 메서드 종료
리턴 언와인딩 과정
- recursive(2,0) → 1 반환
👉 이게 바로 “마지막 return 1”입니다. - 이제 이 값이 윗 단계로 전달돼요:
- recursive(2,1) = 2 * (recursive(2,0)) = 2 * 1 = 2
- recursive(2,2) = 2 * (recursive(2,1)) = 2 * 2 = 4
- recursive(2,3) = 2 * (recursive(2,2)) = 2 * 4 = 8
핵심
- return 1 값은 rec(2,0)의 결과로 반환됩니다.
- 그 결과가 바로 **rec(2,1)**의 곱셈에 들어가고, 차례차례 위로 올라가면서 계산이 완성돼요.