[C] 재귀함수를 비재귀 함수로 바꾸기 1 (재귀 한번)

2019. 7. 26. 19:24 기타/C언어

[C] 재귀함수를 비재귀 함수로 바꾸기 1  (재귀 한번)


재귀 호출을 사용하는 함수는 그렇지 않은 함수에 비해 속도가 느리다.  (항상 그런것은 아니다.)

이는 재귀 호출이 연속적인 함수 호출로 이루어지기에 함수를 호출하기 위한 준비(오버헤드)에 소요되는 시간이 많기 때문이다.

속도가 별로 필요가 없는 경우에는 재귀 함수를 그대로 사용해도 되지만 속도를 요하는 내부 루프 내라면 비재귀 함수로 바꾸어야 한다.


재귀 호출을 사용하는 함수는 시스템 다운의 우려가 있다.

재귀 함수는 자신을 수없이 많이 호출하는 경우가 많다. 함수를 호출할 때는 인자 리스트와 지역 변수, 그리고 호출하는 곳의 주소를 내부 스택에 저장해두어야 하는데 재귀 호출이 빠지지 않고 계속해서 더해지는 경우에는 내부 스택의 영역을 벗어나 힘 영역까지 침범하게된다. (스택 오버 플로우)

이 경우 시스템 다운이 된다.


#include <stdio.h>

int factorial(int n){
    if (n == 0)
        return 1;
    else
        return n*factorial(n - 1);
}

int iter_factorial(int n){
    int f = 1;
    while (n > 0){
        f = f*n--;
    }
    return f;
}

void main(void){

    printf("Recursive Factorial : %d", factorial(5));
    
    printf("\nIteration Factorial : %d", iter_factorial(5));
    
    return 0;
}



출처: https://hyeonstorage.tistory.com/352?category=622873 [개발이 하고 싶어요]