재귀는 문제의 자기유사성을 그대로 비추어, 의도를 가장 짧고 정확하게 표현한다.
많은 문제는 정의 자체가 귀납적이며(트리, 그래프, 수학적 수열), 재귀는 이 정의를 코드로 1:1로 옮깁니다. 루프 제어 변수나 임시 상태로 의도를 감추지 않고, 베이스 케이스와 분할 규칙만으로 로직을 드러내 가독성이 높아집니다. 리뷰와 온보딩에서도 “무엇을 왜 하는지”가 구조로 드러나 팀 커뮤니케이션 비용이 줄어듭니다.
재귀는 명세와 검증이 자연스러워, 더 안전한 코드를 만든다.
베이스 케이스의 정확성과 재귀 가정만 검토하면 전체 정당성을 확보하는 귀납적 추론이 가능합니다. 단위 테스트는 작은 입력과 경계조건에 집중하면 되므로 커버리지가 빠르게 오릅니다. 상태가 적고 경계가 명료해 off-by-one, 인덱스 누락 같은 루프 특유의 오류를 줄입니다.
재귀는 성능 면에서도 불리하지 않으며, 적절한 최적화로 반복과 동등하거나 더 유리할 수 있다.
분할정복 알고리즘의 대표인 mergesort는 재귀 구현이 자연스럽고 시간복잡도 O(n log n)이며, 공간을 적절히 관리하면 캐시 친화적 패턴을 얻습니다. 꼬리 재귀 최적화(TCO)를 지원하는 언어(Scheme, OCaml, Haskell, Erlang 등)에서는 깊은 호출도 스택 사용이 O(1)이 되어 반복과 동일한 공간복잡도를 갖습니다. 메모이제이션을 결합하면 피보나치·동적계획 문제에서 중복 호출을 제거해 지수 시간(예: O(φ^n))을 선형 시간(O(n))으로 줄일 수 있으며, 분할된 하위 문제는 병렬화에도 유리합니다.
재귀는 추상화를 촉진해, 재사용 가능한 패턴과 깨끗한 도메인 모델을 만든다.
map·fold·filter처럼 재귀를 일반화한 패턴은 비즈니스 로직을 데이터 순회로부터 분리해 코드 중복을 줄입니다. catamorphism·anamorphism 등 재귀 스킴은 복잡한 변환을 조립식으로 표현하게 해 유지보수성과 확장성을 높입니다. 이런 추상화는 언어를 바꿔도 설계가 그대로 이식되므로, 팀과 프로젝트의 수명을 늘립니다.