프로그래밍[Univ]/C언어

[C언어] 재귀 호출 함수 Recursion 팩토리얼 구연(재귀 함수이용)

Cloud Travel 2008. 7. 15. 14:59

1. 재귀 함수의 장단점
 1) 재귀 함수는 불려진 만큼 메모리를 할당받는다(소비한다).
 2) 재귀 함수는 함수가 종료되지 않은채 계속 함수를 호출한다.
  > 함수 내에 선포된 자동 변수들이 램에 새롭게 할당을 받는다.
 3) 재귀 함수는 메모리를 많이 소비하여 처리속도가 느리다.

2. 재귀 함수의 예시 펙토리얼(!)
팩토리얼 n! = n*(n-1)!
#include<stdio.h> // Claculate factorial function

long factorial(int x)
{
    if ( x == 1 )
        return 1;

    else return
        x*factorial(x-1);
}

int main()
{
    int n;
    int c = 1;

    printf("  input number : ");
    c = scanf("%d",&n);

    while( c == 1 )
    {
        printf("  %d! = %ld\n",n,factorial(n));
        printf("  input number : ");
        c = scanf("%d",&n);
    }
}

3. 재귀 함수의 원리

 다음의 소스를 보고 재귀 함수의 원르르 알아보자
 #include<stdio.h>
 void number(int x)
 {
     printf(" num up %d\n",x);

     if ( x<3 ) number(x+1);
     printf(" num down %d\n",x);
 }

 int main()
 {
     number(1);

     return 0;
 }
--------------------------- 결과

사용자 삽입 이미지

재귀 함수의 원리를 모른다면 num down 3에서 멈처야만한다.
하지만 num down 1까지 함수는 진행된다.
어찌 된 일일까?
1.재귀 함수의 장단점에서의 설명의 2)현상이 일어난 것이다.
(2) 재귀 함수는 함수가 종료되지 않은채 계속 함수를 호출한다.)

즉, number(1)실행
        number(2)실행
           number(3)실행
           number(3)종료
        number(2)종료
      number(1)종료
    가 일어 난 것이다..

한마디로 말하자면 함수안에 함수가 실행 되므로 안의 함수가 끝나기전에는
바깥의 함수가 닫히지 않고, 안의 함수가 끝나면 바깥의 함수가 닫힌다는 것이다.