C언어의 기초 문법

재귀함수의 특징과 선언 방법

 재귀함수는 제가 말했듯이 '무한루프 함수'인데요, 함수에서 while(1)같은 무한 루프를 어떻게 돌릴까? 라는 생각 하실 수 있는데요, return으로 무조건할 수 있습니다. 국어를 잘 하시는 분들은 아실 텐데, 재귀는 '처음으로 다시 돌아가는 것'이라는 뜻을 가지고 있습니다. return은 끝을 의미하고요. 끝에서 다시 처음으로 돌아간다? 이해 되시지 않나요? 이해가 안 되신다면 이 코드를 봐주세요. 한 번 팩토리얼(!)로 예시를 들어보겠습니다(팩토리얼: 만약 5! 이라면 1*2*3*4*5를 의미합니다.

#include <stdio.h>
#include <stdlib.h>

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

자! 이해가 안 되시죠? 함수 안에 함수가 있다??!?!? 아주 복잡하지만 사실 이 코드는 에러가 없습니다. 너~~무 복잡한데, 일단 간단하게 설명을 해 드릴게요.

자. 만약 main에서 factorial(5) 를 선언했다고 예를 들게요. 일단 함수 안에 들어갑니다. 일단 5는 1이 아니죠? 넘어갑니다. 다음 return 코드에서 n * factorial(n - 1)이 또 나오지요? 그러니까 여기에서는 5 * factorial(4)를 의미합니다. 그러면 또 처음으로 갑니다. 4는 1이 아니죠? 그럼 또 4 * factorial(3)이라는 값이 또 반환되면 또 처음으로 돌아가서 n이 1일 때까지 도는 겁니다. 그러니까 for(i = n; i >= 1; i--)와 같은 코드인 거죠. 결국 factorial(1)이 선언된다면 1이 반환되겠죠? 그러면서 함수는 끝납니다. 그럼 이제 전에 실행했었던 factorial(2)로 돌아가서 return값인 1을 2에 곱합니다. 그리고 그 값을 또 factorial(3)에 가서 거기에 3을 또 곱합니다. 이렇게 하면 결국 값은 5!과 같아진다는 것을 알 수 있지요?

댓글

댓글 본문
  1. 네... 여러분 마음 알아요. 저도 맨 처음에는 많이 어려웠습니다. 질문이 많을 것 같은데, 질문이 있다면 마음껏 질문해주세요! 제가 답해드리겠습니다!
graphittie 자세히 보기