문제의 역사
재귀는 트리 탐색, 팩토리얼 계산, 퀵 정렬 문제를 우아하게 해결하는 데 자주 사용되는 메커니즘입니다. C에서는 함수가 자신의 이름으로 직접 호출될 수 있기 때문에 재귀 호출이 구현됩니다.
문제
재귀는 편리하지만 깊은 중첩으로 인해 스택이 빠르게 가득 차는 위험이 있습니다 (스택 오버플로우). 또한, 최적화가 없으면 큰 입력 데이터에 대해 비효율적으로 작동합니다(예: 꼬리 재귀의 부재).
해결책
재귀를 사용하기 전에 최대 가능한 깊이를 확인하고, 경계 조건(기본 사례)을 구현하고, 메모리(스택) 사용을 고려하며, 비판적인 경우 알고리즘을 반복적인 방식으로 다시 작성해야 합니다.
코드 예시:
// 재귀적으로 팩토리얼 계산 unsigned long factorial(unsigned int n) { if (n <= 1) return 1; // 기본 사례 return n * factorial(n - 1); // 재귀 사례 }
주요 특징:
C에서 함수가 자신의 이름을 사용하여 직접 자신을 호출할 수 있습니까?
아니요. 함수는 자신의 이름을 사용하여 자신만 호출할 수 있으며, 호출 시점에 정의되어 있어야 합니다(또는 최소한 미리 선언되어 있어야 합니다).
재귀가 항상 반복문보다 효율적입니까?
아니요! 반복적인 솔루션이 종종 더 빠르고 안정적으로 작동하므로 스택을 빠르게 소모하지 않으며 함수 호출에 추가 비용이 필요하지 않습니다.
재귀 후 원래 상태로 모든 스택이 복구됩니까?
네, 각 재귀 함수에서 벗어날 때마다 스택이 완전히 해제됩니다. 가장 바깥쪽 함수가 완료된 후 메모리는 이전 상태로 돌아갑니다.
개발자가 깊이 검증 없이 100,000 노드의 트리를 재귀로 탐색하는 함수를 구현했습니다. 스택 오버플로우가 발생했습니다.
장점:
재귀 깊이를 추적하고 너무 깊은 중첩을 방지하기 위해 보호가 구현된 알고리즘, 큰 탐색은 배치로 나뉘어집니다(반복적 옵션).
장점: