Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 코딩테스트준비
- C
- 코드트리
- 데이터베이스
- 인접 행렬
- 운영체제
- 자바스크립트
- til
- 코딩테스트사이트추천
- 개발자루틴
- 연결 리스트
- 갭체크
- 1일1코테
- 프로그래머스
- 자료구조
- 플로이드-워셜
- 코테공부
- 파이썬
- 오블완
- 프로그래밍 언어
- 코딩테스트
- 티스토리챌린지
- 알고리즘
- 항해99
- Java
- 개발자취업
- 99클럽
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 웹
- 자바
Archives
- Today
- Total
와드의 블로그
2. 재귀 본문
2-1. 함수의 재귀적 호출의 이해
* 재귀 함수의 기본적인 이해
재귀 함수: 함수 내에서 자기 자신을 다시 호출하는 함수
재귀 함수의 구성: 재귀의 탈출 조건, 재귀의 탈출, 함수의 재귀적 호출
void Recursive(int num)
{
if (num <= 0) // 재귀의 탈출 조건
return; // 재귀의 탈출
printf("Recursive call! %d\n", num);
Recursive(num - 1); // 함수의 재귀적 호출
}
* 재귀 함수의 예시
int Factorial(int n) {
if (n == 0)
return 1;
else
return n * Factorial(n - 1);
}
2-2. 재귀의 활용
* 피보나치 수열
int Fibonacci(int n) {
if (n == 1)
return 0;
else if (n == 2)
return 1;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
* 이진 탐색 알고리즘의 재귀적 구현
int BinarySearchRecursion(int arr[], int first, int last, int target) {
int mid;
if (first > last)
return -1; // 탐색의 실패를 의미하는 반환값
mid = (first + last) / 2; // 탐색 대상의 중앙을 찾는다.
if (arr[mid] == target)
return mid; // 탐색된 타겟의 인덱스 값 반환
else if (target < arr[mid])
return BinarySearchRecursion(arr, first, mid - 1, target);
else
return BinarySearchRecursion(arr, mid + 1, last, target);
}
2-3. 하노이 타워
* 하노이 타워 문제의 이해
세 개의 기둥과 이 기둥에 꽂을 수 있는 크기가 다양한 원판들이 있고, 초기에 한 기둥에 원판들이 작은 것이 위에 있도록 순서대로 쌓여 있다. 다음 두 가지 조건을 만족시키면서, 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮겨서 다시 쌓으면 문제가 해결된다.
- 한 번에 한 개의 원판만 옮길 수 있다.
- 큰 원판이 작은 원판 위에 있어서는 안 된다.
3단 하노이 타워의 해결 과정은 다음과 같다.

그렇다면 n단 하노이 타워는 어떻게 해결할 수 있을까?
* 하노이 타워 문제의 해결
하노이 타워 문제는 재귀적으로 해결이 가능하다.
1. 작은 원판 n - 1 개를 A 막대에서 B 막대로 이동
2. 제일 큰 원판을 A 막대에서 C 막대로 이동
3. 작은 원판 n - 1 개를 B 막대에서 C 막대로 이동
다음 해결 과정을 재귀 함수로 표현하면 다음과 같다.
void HanoiTowerMove(int num, char from, char by, char to) {
if (num == 1) // 이동할 원판의 수가 1개라면
printf("원판1을 %c에서 %c로 이동\n", from, to);
else {
HanoiTowerMove(num - 1, from, to, by); // 3단계 중 1단계
printf("원판%d을(를) %c에서 %c로 이동\n", num, from, to); // 3단계 중 2단계
HanoiTowerMove(num - 1, by, from, to); // 3단계 중 3단계
}
}'CS > 자료구조' 카테고리의 다른 글
| 6. 스택 (0) | 2021.09.06 |
|---|---|
| 5. 연결 리스트 3 (0) | 2021.09.04 |
| 4. 연결 리스트 2 (0) | 2021.09.04 |
| 3. 연결 리스트 1 (0) | 2021.09.03 |
| 1. 자료구조와 알고리즘의 이해 (0) | 2021.09.03 |