Algorithm/이론
재귀함수 (Recursion)
Dev Warrior Jungi
2025. 5. 2. 00:47
재귀함수
1) 재귀함수 란?
함수가 자기 자신을 호출하는 방식의 함수입니다.
대표적으로, 팩토리얼 계산, 피보나치 수열, 하노이 탑, DFS, 백트래킹 등 모든 깊이 탐색 알고리즘의 기반이 됩니다.
2) 재귀함수의 동작원리
재귀 함수는 내부적으로 '스택 구조'를 따릅니다.
즉, 함수가 호출될 때마다 현재 함수는 잠깐 멈추고, 새로운 함수 호출이 먼저 끝날 때까지 기다립니다.
맨 마지막 호출이 종료되면 차례로 다시 돌아옵니다.
3) DFS 활용분야
활용 분야 | 설명 |
경로 찾기 | 특정 노드까지의 경로 유무, 경로 목록 찾기 |
미로 탐색 | 출구가 있는지 확인하거나 모든 경로 탐색 |
백트래킹 문제 | N-Queen, 순열/조합, 스도쿠 해결 등 |
트리 탐색 | 전위/중위/후위 순회 구현 |
사이클 탐지 | 그래프 내 순환 여부 확인 |
위상 정렬 | DFS 기반 구현 가능 (방문 완료 시점 기록) |
연결 요소 탐색 | 연결된 노드 그룹 찾기 (Connected Components) |
3) 재귀함수의 3요소
요소 | 설명 | 예시 |
Base case (종료 조건) | 재귀 호출을 멈추는 조건 | if (n == 1) return 1; |
Recursive case (자기 호출) | 자신을 다시 호출하는 부분 | factorial(n - 1) |
문제 축소 | 매 호출마다 문제 크기를 줄임 | n → n-1 → ... |
4) 재귀함수의 주의점
1. 반드시 종료 조건이 있어야 함 (없으면 무한 호출 → StackOverflow)
2. 호출 스택이 깊어질수록 메모리 사용량 증가
3. 반복문보다 느릴 수 있음 → DP/메모이제이션으로 최적화 필요
5) 재귀함수의 예시 - 팩토리얼
n! = n * (n-1) * (n-2) * ... * 1
public class Factorial {
public static int factorial(int n) {
if (n == 1) return 1; // 종료 조건 (Base case)
return n * factorial(n - 1); // 자기 자신 호출
}
public static void main(String[] args) {
System.out.println(factorial(5)); // 5! = 120
}
}
// 동작흐름
factorial(5)
→ 5 * factorial(4)
→ 5 * 4 * factorial(3)
→ 5 * 4 * 3 * factorial(2)
→ 5 * 4 * 3 * 2 * factorial(1)
→ 5 * 4 * 3 * 2 * 1 = 120
[백준 10870] Java - 피보나치 수 5
https://www.acmicpc.net/problem/10870 피보나치 수 5 1) 문제피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다.그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이
devwarriorjungi.tistory.com