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

Posted at 2015.02.19 15:04 | Posted in C



facebook에 글올리기



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


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

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

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


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

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

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



Colored By Color Scripter

#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;
}

 


저작자 표시 비영리 변경 금지
신고
이웃추가
facebook에 글올리기

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

티스토리 툴바