재귀함수(Recursive Function)는 자기 자신을 호출하는 함수입니다. 이를 통해 하나의 큰 문제를 작은 문제로 분할하고, 이를 해결한 후 이를 합쳐서 큰 문제를 해결하는 방식으로 프로그램을 작성할 수 있습니다. C언어에서 재귀함수는 함수 내에서 자신을 호출하는 방식으로 구현할 수 있습니다.
재귀함수는 보통 하나 이상의 종료 조건(Base Case)과 하나 이상의 재귀 호출(Recursive Call)로 구성됩니다. 종료 조건은 재귀 호출이 멈추는 지점을 나타내며, 재귀 호출은 큰 문제를 작은 문제로 분할하여 해결하는 역할을 합니다.
재귀함수를 사용할 때는 몇 가지 주의할 점이 있습니다. 먼저, 재귀함수의 호출은 스택(Stack) 구조로 이루어지기 때문에, 호출 횟수가 많아질수록 메모리 사용량이 증가합니다. 따라서, 너무 많은 재귀 호출을 사용할 경우 스택 오버플로(Stack Overflow)가 발생할 수 있습니다. 또한, 재귀함수의 코드는 반복문을 사용하는 코드보다 이해하기 어렵고 느리게 동작할 수 있습니다.
아래는 재귀함수로 풀기 좋을만한 몇 가지 주제를 살펴보겠습니다.
1. 이진 탐색(Binary Search)
이진 탐색은 정렬된 리스트에서 원하는 값을 찾는 알고리즘입니다.
#include <stdio.h>
int binary_search(int arr[], int start, int end, int target) {
if (start > end) {
return -1;
}
int mid = (start + end) / 2;
if (arr[mid] == target) {
return mid;
}
else if (arr[mid] > target) {
return binary_search(arr, start, mid - 1, target);
}
else {
return binary_search(arr, mid + 1, end, target);
}
}
int main() {
int arr[] = {1, 3, 5, 7, 9};
int n = sizeof(arr) / sizeof(int);
int target = 5;
int result = binary_search(arr, 0, n - 1, target);
if (result == -1) {
printf("원소를 찾을 수 없습니다.\n");
}
else {
printf("원소의 인덱스는 %d입니다.\n", result);
}
return 0;
}
2. 피보나치 수열(Fibonacci Sequence)
피보나치 수열은 0과 1로 시작하여, 이전 두 개의 항을 더한 값을 다음 항으로 하는 수열입니다.
#include <stdio.h>
int fibonacci(int n) {
if (n == 0) {
return 0;
}
else if (n == 1) {
return 1;
}
else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
int main() {
int n = 10;
int result = fibonacci(n);
printf("%d번째 피보나치 수열은 %d입니다.\n", n, result);
return 0;
}
3. 하노이의 탑(Hanoi Tower)
하노이의 탑은 원반이 세 개의 기둥에 꽂혀 있을 때, 첫 번째 기둥의 원반들을 세 번째 기둥으로 옮기는 문제입니다.
재귀함수를 사용하여 구현할 수 있습니다.
#include <stdio.h>
void hanoi(int n, char from, char to, char temp) {
if (n == 1) {
printf("%c에서 %c로 원반 %d을 이동합니다.\n", from, to, n);
}
else {
hanoi(n - 1, from, temp, to);
printf("%c에서 %c로 원반 %d을 이동합니다.\n", from, to, n);
hanoi(n - 1, temp, to, from);
}
}
int main() {
int n = 3;
hanoi(n, 'A', 'C', 'B');
return 0;
}
4. 이항 계수(Binomial Coefficient)
이항 계수는 주어진 n과 k에 대해 n개의 원소 중 k개를 뽑을 때의 경우의 수를 계산하는 공식입니다.
#include <stdio.h>
int binomial(int n, int k) {
if (k == 0 || k == n) {
return 1;
}
else {
return binomial(n - 1, k - 1) + binomial(n - 1, k);
}
}
int main() {
int n = 5;
int k = 2;
int result = binomial(n, k);
printf("%d개의 원소 중 %d개를 뽑을 때의 경우의 수는 %d입니다.\n", n, k, result);
return 0;
}
위 예제 코드들은 각각 이진 탐색, 피보나치 수열, 하노이의 탑, 이항 계수를 재귀함수를 사용하여 구현한 것입니다. 재귀함수를 사용하면 코드의 간결함과 가독성을 높일 수 있습니다. 또한, 문제의 구조를 재귀적으로 표현하면 문제 해결에 용이합니다. 단, 재귀함수를 사용할 때는 종료 조건을 잘 설정하여 무한 반복에 빠지지 않도록 주의해야 합니다.
'Major > #C언어 (C Programming)' 카테고리의 다른 글
배열을 사용한 구구단 출력(Multiplication table output using arrays) (0) | 2023.05.06 |
---|---|
1차원배열(1 Dimensional Array), 다차원배열(Multi-dimensional array (0) | 2023.05.06 |
C언어의 반복문 (while문, do~while문, for문) (0) | 2023.04.27 |
아스키 코드 (ASCII Code) (0) | 2023.04.27 |
정수자료형, 실수자료형 (Integer Data Types, Real Data Types) (0) | 2023.04.27 |
댓글