C 언어 | 함수 | 재귀 처리

자기 자신을 호출하는 함수에 의한 재귀 처리에 대해 설명한다.

자신을 호출하는 함수

어떤 함수에서 다른 함수를 호출하는 방법은 지금까지 설명하였다. 그런데, 함수 내에서 자기 자신을 호출하면 어떻게 될까. 이런 함수 내에서 자신을 호출하는 것을 재귀라고 한다. 예를 들어, 다음과 같은 함수를 생각해 보자.

void Function() {
 Function();
}

Function() 함수는 자기자신을 함수 내에서 호출하고 있다. 이 경우는 영원히 자신을 호출하기 때문에 무한 루프에 빠지게 된다.

재귀를 사용하여 특수한 루프를 만들 수 있다. 그러나 대부분의 것은 재귀를 사용하지 않아도 반복 문장에서 가능하다. 따라서 재귀를 사용하는 것은 극히 드문 경우이다. 왜냐하면 함수 호출은 반복 문장으로 만든 반복보다 느리기 때문이다. 재귀는 일부 알고리즘을 단순화하는데 사용될 수 있다.

코드1

#include <stdio.h>

void Function(int , int);

int main() {
 Function(0 , 10);
 return 0;
}

void Function(int iCount , int iMax) {
  if (iCount < iMax) {
    printf("Count = %d\n" , iCount);
   Function(iCount + 1 , iMax);
  }
}

코드1은 재귀 처리의 이용법을 이해하는 간단한 프로그램이다. 재귀 처리를 이용한 함수 Function()는 첫번째 인수에 카운터의 초기 값을 지정하고, 두번째 인수에 최대 값을 지정한다. Function() 함수는 iCount가 iMax이하이면, Function(iCount + 1, iMax)과 같이 카운터를 증가시키고 자신을 호출한다.

이것을 반복하는 것으로 iCount는 언젠가 iMax에 도달하고, Function() 함수는 차례 차례로 제어를 반환하여 최종적으로 호출한 곳까지 복귀하는 구조로 되어 있다. 이 밖에도 재귀를 이용한 기술로는 함수 A() 함수가 B()를 호출하고, 함수 B()가 함수 A()를 호출하는 상호 재귀라는 관계도 생각할 수 있다.

void FunctionA() {
 FunctionB();
}

void FunctionB() {
 FunctionA();
}

재귀를 실제 이용하는 사례는 많지 않지만, 트리 구조와 같은 데이터의 분석 및 검색 등에서 응용된다.