재귀 함수(Recursion Function)는 정의 단계에서 자기 자신을 재참조하는 함수를 의미한다. 이는 큰 문제를 동일한 구조를 가진 더 작은 하위 문제로 나누어 해결하는 프로그래밍 패턴으로, 주로 반복적인 작업을 수행하거나 수학적 정의를 코드로 구현할 때 사용된다.

배너 광고

개요

재귀는 어떤 것을 정의할 때 자기 자신을 참조하는 행위를 뜻한다. 프로그래밍에서 재귀 함수는 함수가 실행 과정에서 자기 자신을 다시 호출하는 형태로 구현된다. 이는 복잡한 문제를 간단한 단위 동작과 그 동작을 반복하는 하위 문제로 단순화할 수 있을 때 유용하게 사용된다.

주요 구성 요소

재귀 함수가 올바르게 작동하기 위해서는 반드시 다음의 두 가지 요소를 포함해야 한다.

  • 기본 사례 (Base Case): 재귀 호출을 중단하고 결과를 반환하는 종료 조건이다. 이 조건이 없거나 충족되지 않으면 함수가 무한히 호출된다.
  • 재귀 사례 (Recursive Case): 문제를 더 작은 단위로 쪼개어 자기 자신을 다시 호출하는 부분이다. 호출이 반복될수록 입력값은 점차 기본 사례에 가까워져야 한다.

작동 원리와 호출 스택

재귀 함수는 메모리의 호출 스택(Call Stack) 구조를 이용한다. 함수가 호출될 때마다 매개변수, 지역 변수, 복귀 주소 등의 정보가 스택에 쌓인다.

  1. 함수가 자기 자신을 호출하면 새로운 실행 컨텍스트가 스택에 추가된다.
  2. 기본 사례에 도달할 때까지 스택은 계속 깊어진다.
  3. 종료 조건이 만족되면 가장 마지막에 호출된 함수부터 결과값을 반환하며 스택에서 제거(LIFO)된다.
  4. 최종적으로 처음 호출된 함수까지 결과가 전달되며 전체 연산이 마무리된다.

반복문과의 비교

재귀와 반복문(for, while)은 많은 경우 서로 대체가 가능하다. 두 방식의 특징은 다음과 같다.

구분재귀 (Recursion)반복 (Iteration)
코드 형태간결하고 직관적임상대적으로 복잡할 수 있음
메모리 사용호출 스택 누적으로 많이 사용상대적으로 적게 사용
속도함수 호출 오버헤드로 느릴 수 있음상대적으로 빠름
위험 요소스택 오버플로우 발생 가능무한 루프 발생 가능

주요 사례

재귀 함수는 수학적 정의나 계층적 자료구조를 다룰 때 자주 사용된다.

  • 팩토리얼(Factorial): n!=n×(n1)!n! = n \times (n-1)! (단, 0!=10! = 1)
  • 거듭제곱: xn=x×xn1x^n = x \times x^{n-1}
  • 기타: 피보나치 수열, 트리(Tree) 탐색, 하노이의 탑 문제 해결 등

한계 및 주의사항

재귀 함수는 호출 스택의 크기에 제한을 받는다. 대부분의 런타임 환경에서는 최대 호출 스택 크기가 정해져 있으며, 이를 초과할 경우 스택 오버플로우(Stack Overflow) 에러가 발생하며 프로그램이 강제 종료된다. 따라서 깊은 재귀가 필요한 경우에는 반복문을 사용하거나 꼬리 재귀 최적화 등의 기법을 고려해야 한다.

참고 자료

5
재귀 (Recursion) - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN재귀 (Recursion) - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN - Skip to main content - Skip to search This page was translated from English by the community. Learn more and join the MDN Web…https://developer.mozilla.org/ko/docs/Glossary/Recursion재귀와 스택재귀와 스택 KO 본 튜토리얼은 전 세계 사람들이 이용할 수 있는 오픈 소스 프로젝트입니다.프로젝트 페이지에 방문하셔서 번역을 도와주세요. 검색 검색 Light themeDark theme 공유 عربيEnglishEspañolفارسیFrançaisIndonesiaItaliano日本語한국어РусскийTürkçeУкр…https://ko.javascript.info/recursion자료구조 알고리즘 2주차 - 메옹님의 블로그 - 인프런 | 커뮤니티자료구조 알고리즘 2주차 - 메옹님의 블로그 - 인프런 | 커뮤니티 ## 자료구조 알고리즘 2주차 ## 재귀 (Recursion) ### 재귀 구현 함수가 자기 자신을 호출하는 방식 기본적으로 종료 조건(Base case) 과 반복 호출(Recursive case) 로 구성됨 ``` const myFunc = (numb…https://inflearn.com/blogs/9872재귀 함수(Recursion Function)의 장점과 단점재귀 함수(Recursion Function)의 장점과 단점 로그인 로그인 # 재귀 함수(Recursion Function)의 장점과 단점 이동준·2023년 7월 27일 팔로우 1 ## 자바스크립트 목록 보기 18/28 ## Recursive(재귀) vs Iterative(반복) 보통`Recursive`와`Iterati…https://velog.io/@dongjun187/%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98Recursion-Function%EC%9D%98-%EC%9E%A5%EC%A0%90%EA%B3%BC-%EB%8B%A8%EC%A0%90재귀 (Recursion) 알고리즘 | 알고달레재귀 (Recursion) 알고리즘 | 알고달레 # 재귀 (Recursion) 알고리즘 재귀(Recursion) 알고리즘은 재귀 함수를 이용하는 상당히 광범위한 프로그래밍 기법인데요. 여기서 재귀 함수란 함수 내부에서 자기 자신을 다시 호출하는 특수한 형태의 함수를 의미합니다. ## 재귀 알고리즘 재귀 알고리즘을 사용하…https://www.algodale.com/algorithms/recursion/

관련 문서