더북(TheBook)

7.3 재귀호출

함수의 핵심 기능 중 하나는 캡슐화(encapsulation)다. 즉, 로컬 변수는 오직 함수 안에서만 존재하고 볼 수 있으며, return문이 실행되거나 블록의 끝에 다다라서 그 함수가 종료되면 사라진다. 함수에서 사용하는 식별자(이름)는 다른 함수 안의 식별자와 충돌하지 않는다. 또한 함수가 종료되면 그동안 쓰던 것들은 깔끔하게 사라진다.

그뿐만이 아니다. 함수를 호출할 때마다 (함수 매개변수를 포함한) 로컬 변수 집합이 새로 생성되어 초기화된다. 좀 전에 호출했던 것과 동일한 함수라도 실행 문맥은 완전히 다르다. 호출된 함수에서 다른 함수를 호출하는 계층 구조가 형성된 상태도 마찬가지다. 자기 자신을 직접적으로나 간접적으로 호출하는 것을 재귀호출(recursion)이라 한다.

재귀 함수(recursive function)는 C 함수를 이해하는 데 굉장히 중요하다. 재귀 함수는 함수 호출 모델의 핵심 기능을 활용하며, 이 기능을 사용해야만 재귀 함수가 제대로 작동한다. 재귀 함수에 대한 첫 번째 예제로 두 수의 최대공약수를 계산하는 유클리드 알고리즘을 구현해 보자.

 

euclid.h

 8 size_t gcd2(size_t a, size_t b) {
 9   assert(a <= b);
10   if (!a) return b;
11   size_t rem = b % a;
12   return gcd2(rem, a);
13 }
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.