반응형

문제풀이에 앞서서 재귀함수에 대해 간단히 알아보고자 한다.


재귀는 작은문제로 나눠서 동일한 알고리즘을 반복적으로 적용하여 작은문제를 해결한 뒤 큰 문제를 해결할 수 있을 때 사용한다.

재귀적 정의는 base case(재귀함수를 종료)inductive part(재귀함수를 호출)으로 구성된다.


재귀함수 작성 절차

더 작은 문제로 표현할 수 있는가?

문제를 직접 풀 수 있는 것이 어떤 경우인지 base case로 확인

그럼 위 작성절차에 따라 팩토리얼 함수를 재귀적으로 생각해보자.


1
2
3
4
5
6
7
팩토리얼 재귀함수
 
base case:
    n<=1 return 1
 
inductive part:
    return n*factorial(n-1);
cs



이를 소스로 나타내면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
int factorial(int n) {
 
    if(n<=1)    //base case
 
        return 1;
 
    else         //inductive part
 
        return n*factorial(n-1);
 
}
cs


반복 / 재귀를 사용해야 할 때

사실 재귀함수는 반복문으로 구현할 수 있고 반복문으로 구현하는것이 조금이라도 더 효율적이기 때문에 반복문으로 구현하는 것이 성능상으로는 더 좋다. 하지만 문제에 따라 재귀적 구현이 더 간단하고 자연스러운 경우가 있으므로 문제에 따라 적절하게 사용하는 것을 추천한다.(분할정복등을 통해 시간복잡도를 줄일 수 있는 경우와 같은 특수 케이스는 제외)


 * 참고

재귀함수는 함수를 반복해서 호출하므로 함수 인자를 반복해서 생성하기 때문에 stack 메모리에 계속 할당하며 부가적인 오버헤드가 생긴다.



반응형

'Algorithm 이론' 카테고리의 다른 글

[Bitmask] 비트마스크 기초  (0) 2019.01.28

+ Recent posts