티스토리 뷰

자료구조

함수의 재귀적 호출의 이해

취뽀가자!! 2018. 5. 17. 14:36

재귀함수의 기본적인 이해

재귀함수란 다음과 같이 함수 내에서 자기 자신을 다시 호출하는 함수를 의미한다.

1
2
3
4
void Recursive(void){
    printf("Recursive all! \n");
    Recursive();
}
cs


이 형태의 함수 호출을 우리는 이렇게 이해할 것이다.



위의 그림이 혹시 이해되지 않을 경우 함수가 호출되면 함수의 복사본이 실행되는 구조로 이해해보길 바란다.



위 그림은 복사본이 복사본을 만들고, 또 그 복사본이 다른 복사본을 만들면서 실행되는 구조이다.


위의 Recursive함수는 탈출 조건이 없기에 무한 루프를 돌게 된다. 무한루프를 방지하기 위해 우리는 아래 코드와 같이 탈출 조건이라는 것을 추가해야 한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
 
void Recursive(int num) {
    if (num <= 0)
        return 0;
    printf("Recursive call! %d\n", num);
    Recursive(num - 1);
}
 
int main() {
    Recursive(3);
    return 0;
}
cs


위 예제는 숫자가 0이하인 경우 함수가 종료되도록 해 놓았다.

그리고 num이 0이 되는 순간 '재귀의 탈출조건'이 성립되어 함수가 반환하기 시작한다.



재귀함수의 디자인 사례

재귀함수를 사용함으로써 문제를 단순화 시킬 수 있고, 재귀적인 수학적 수식을 그대로 옮길 수 있다. 

이러한 재귀함수의 특징을 팩토리얼(factorial) 값을 반환하는 함수를 재귀적으로 구현해 보겠다.

팩토리얼의 수식은 다음과 같다.

n! = n x (n-1) x (n-2) x (n-3) x ... x 2 x 1

위 수식을 코드로 옮겨보면


1
2
3
4
if (n == 0)
        return 1;
    else
        return n * Factorial(n - 1);
cs


이렇게 쓸 수 있다. 


이번에는 팩토리얼 예제를 실행해보면서 실제로 값을 정확히 계산하는지 해보도록 하자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
 
int Factorial(int n) {
    if (n == 0)
        return 1;
    else
        return n * Factorial(n - 1);
}
 
int main() {
    printf("1! == %d\n", Factorial(1));
    printf("3! == %d\n", Factorial(3));
    printf("6! == %d\n", Factorial(6));
}
cs




--------------------------------------------------------

이 글은 <윤성우의 열혈 자료구조>를 공부하며 정리한 글입니다.

'자료구조' 카테고리의 다른 글

단순 연결 리스트(1/2)  (0) 2018.11.10
하노이타워(재귀적 구현)  (0) 2018.10.03
재귀의 활용  (0) 2018.05.21
알고리즘의 성능 분석 방법  (2) 2018.05.11
자료구조에 대한 기본적인 이해  (0) 2018.05.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함