※요약

재귀 함수란 자기 자신을 호출하는 함수


일반적인 함수 호출 방법은 다음과 같다. 프로그램 실행 중 함수를 만나면 현재 위치를 저장 후, 호출할 함수의 주소로 점프해 함수 내용을 수행한다. 함수 실행이 끝나면 기억해뒀던 원래 위치로 복귀해 다음 코드를 수행한다. (일반적으로 잦은 함수 호출로 인한 점프의 반복은 속도를 느리게 한다.)


일반 함수나 재귀 함수나 위와 같은 방법으로 함수가 호출이 되는데 재귀 함수의 경우 함수의 실행이 채 끝나기도 전에 자기 자신을 호출한다. 이게 가능한 이유는 호출된 각 함수에 대한 복귀 번지, 인수, 지역 변수 등이 스택 프레임에 저장되기 때문에 기존의 작업 내용들이 서로 방해하지 않고 잘 동작할 수 있는 것이다.


※재귀 함수 특징

 - 무한 루프에 빠지지 않기 위해 일정한 탈출 조건이 있어야 한다.

 - 코드를 단순화 할 수 있다.

 - 재귀 함수는 호출 시 마다 스택 공간을 이용하므로 무리하게 호출하면 스택 오버플로우가 일어날 수 있다.

 - 재귀 함수의 호출 횟수는 스택의 남은 공간과 재귀 함수의 지역 변수 사이즈에 따라 달라진다.

 - 디버깅 및 실행 흐름을 파악하기 힘들다.



※예제

아래 예제는 기초적인 재귀 함수 예제다.

다음 게시물부터는 재귀를 이용한 팩토리얼(factorial), 거듭 제곱(power, square), 이진 탐색(binary search) 등을 알아보겠다.

#include <stdio.h>

void Recursive( int nCount )
{
	if( nCount <= 0 )
	{
		printf( "발사\n" );
		return ;
	}
	else
	{
		printf( "카운트 다운 : %d\n", nCount );
		Recursive( nCount-1 );        //인자로 받은 nCount에 -1을 줄여서 호출한다.
	}
}

int main( )
{
	Recursive( 5 );

	return 0;
}


결과


+ Recent posts