1. 재귀를 통한 문제 해결
1.1 재귀의 개념과 구조
- 재귀는 문제를 동일한 형태의 작은 문제로 나누어 해결하는 방식입니다
- 재귀 함수는 자기 자신을 호출하여 문제를 해결합니다
1.2 재귀의 핵심 요소
- 재귀의 핵심 요소는 종료 조건(Base Case)과 재귀 호출(Recursive Case)입니다
1.2.1 종료 조건 예제
def factorial(n):
# 종료 조건
if n <= 1:
return 1
# 재귀 호출
return n * factorial(n-1)
- 재귀 호출이 끝나는 시점을 명확히 정의해야 합니다
- 종료 조건이 없으면 무한 재귀에 빠질 수 있습니다
1.2.2 재귀 호출 특징
- 문제를 더 작은 단위로 나누어 자신을 다시 호출합니다
- 각 호출마다 문제의 크기가 감소해야 합니다
1.3 재귀로 피보나치 수열 구현하고 문제점 분석
1.3.1 기본 재귀 구현
def fibonacci(n):
# 종료 조건
if n <= 1:
return n
# 재귀 호출
return fibonacci(n-1) + fibonacci(n-2)
- 시간 복잡도: O(2ⁿ)
- 중복된 계산이 많아 성능이 떨어집니다
- 예) fibonacci(3) = fibonacci(2) + fibonacci(1) = fibonacci(1) + fibonacci(0) + fibonacci(1)
- fibonacci(1)이 중복 호출됩니다
- 메모리 문제
- 재귀 호출마다 스택 프레임이 쌓임
- 깊은 재귀의 경우 스택 오버플로우 발생 가능
- 각 호출마다 지역 변수와 반환 주소가 스택에 저장됨