재귀(Recursion)
by Frinee이 글은 윤성우 저 - "윤성우의 열혈 자료구조"를 공부하고 정리하여 작성하였습니다.
1. 함수의 재귀적 호출의 이해
- 재귀함수: 함수 내에서 자기 자신을 다시 호출하는 함수
- 실제로는 재귀함수가 실행되는 경우, 원본의 복사본이 하나 더 만들어져 복사본을 실행하게 됨
2. 재귀의 활용
피보나치 수열
$$ fib(n) = \begin{cases} 0, & \text{if } n = 1 \\ 1, & \text{if } n = 2 \\ fib(n-1) + fib(n-2), & \text{otherwise } \end{cases} $$
- fib(n) 실행 시, fib(n-1)가 다시 호출되고 이후, fib(n-2)가 실행됨
function fibonacci(n) {
if (n == 1){
return 0;
} else if (n == 2) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
console.log(fibonacci(10)); // 결과: 55
3. 하노이 타워
- 기둥이 3개가 있고 맨 왼쪽 기둥에 있는 원반을 맨 오른쪽으로 그대로 옮기는 게임
- 큰 원반이 작은 원반 위에 있으면 안됨
- 원반의 개수가 n으로 무한히 커져도 변하지 않는 과정이 있음
- 작은 원반 n-1개를 기둥 A에서 B로 이동
- 큰 원반 1개를 A에서 C로 이동
- 작은 원반 n-1개를 B에서 C로 이동
→ from에 꽃혀있는 num개의 원반을 by를 거쳐 to로 이동
※ 탈출 조건: 이동해야 할 원반의 개수가 1개인 경우
function hanoi(n, start, end, aux) {
if (n === 1) {
// 원반이 하나일 경우 직접 목표 지점으로 이동
console.log(`Move disk 1 from ${start} to ${end}`);
return;
}
// n-1개의 원반을 보조 기둥으로 이동
hanoi(n - 1, start, aux, end);
// 가장 큰 원반을 목표 기둥으로 이동
console.log(`Move disk ${n} from ${start} to ${end}`);
// n-1개의 원반을 목표 기둥으로 이동
hanoi(n - 1, aux, end, start);
}
// 예시: 원반 3개를 A에서 C로 이동
hanoi(3, 'A', 'C', 'B');
- 출력 결과
Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C
자료
- 윤성우의 열혈 자료구조 (윤성우 저, 2023.10)
'[컴퓨터 과학자 스터디] > 자료구조' 카테고리의 다른 글
스택(stack) (0) | 2024.11.21 |
---|---|
연결 리스트(Linked List) 3 (0) | 2024.11.20 |
연결 리스트(Linked List) 2 (1) | 2024.11.18 |
연결 리스트(Linked List) 1 (0) | 2024.11.18 |
자료구조와 알고리즘의 이해 (0) | 2024.11.14 |
블로그의 정보
프리니의 코드저장소
Frinee