재귀함수(Recursion function)란 정의 단계에 자신을 재참조하는 함수이다.
재귀함수의 특징
- 전달되는 '상태'인 '매개변수'만 달라질 뿐 똑같은 일을 한다.
- 그러다가 어떤 '상태'에 도달했을 때 종료되는 '기저 사례'가 있다.
- 함수 호출에 대한 코스트가 크므로 반복문으로 풀 수 있으면 반복문으로 푸는게 좋다.
큰 문제를 작은 문제로 나누어 해결할 때 사용한다.
재귀함수를 사용할 때 주의해야 할 점
- 기저 사례를 반드시 작성해야 한다. (안그러면 무한히 반복하므로)
- 사이클이 있다면 사용할 수 없다. ( f(a) -> f(b) -> f(a) ... 같은 이유로 무한 반복..)
Factorial
이 점화식을 코드로 표현하면 아래와 같다.
int factorial(int n)
{
if (n < 2) return 1; // 기저 사례
return n * factorial(n - 1);
}
그런데 위에서 재귀함수의 특징에서 얘기한 바와 같이,
반복문으로 풀 수 있으면 반복문으로 푸는 게 좋다.
int factorial(int n)
{
int ret = 1;
for (int i = 1; i <= n; i++)
ret *= i;
return ret;
}
재귀함수를 만들 때는 정점과 정점의 간선이 어느정도는 상상이 되어야 한다
Fibonacci
int fibonacci(int n)
{
if (n < 2) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
피보나치 수 같은 문제는 반복문으로 하면 어렵기 때문에 재귀함수로 풀어야 한다.
재귀함수는 처음에 어려울 수 있으나 도식화해서 풀어서 그려보고 그 과정을 반복하면 해결할 수 있다.
'자료구조와 알고리즘 > [Inflearn_큰돌] 10주 완성 C++ 코딩테스트' 카테고리의 다른 글
1주차-2. 10988번 팰린드롬인지 확인하기 (2) | 2022.09.13 |
---|---|
1주차-1. 2979번 트럭 주차, 카운팅 배열에 대한 개념 (0) | 2022.09.12 |
1주차-0. 기초 개념 : 개념 강의 (0) | 2022.09.04 |
0주차-3. 기초 개념 : 조합(Combination) (0) | 2022.09.03 |
0주차-2. 기초 개념 : 순열(Permutation) (0) | 2022.09.03 |
댓글