Recursion은 Data structure라고 할수는 없지만, 함께 이해하기 좋은 개념입니다.
**재귀함수(Recursion)**는 어떤 함수를 정의할 때, 그 함수 자체를 재참조하는 함수를 말합니다.
어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다. "재귀함수가 뭔가요?" 잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어. 마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지. 그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어. "재귀함수가 뭔가요?" 잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을...
아래의 간단한 예제 코드를 봅시다.
function factorial(n) {
if (n === 1) {
return 1;
}
return n * factorial(n - 1);
}
만약, *factorial(5)*를 실행한다면 결과값으로 *5 * factorial(4)*를 반환하고,
*factorial(4)*는 *4 * factorial(3)*이 반환됩니다.
*factorial(3)*은 *3 * factorial(2)*가 되고,
*factorial(2)*는 *2 * factorial(1)*이 되는데,
이때 *factorial(1)*의 결과값이 1이므로
최종적으로 *5 * (4 * (3 * (2 * (1))))*과 같이 됩니다.
위와 같이 함수 자체를 다시 한번 실행하는 함수를 *재귀함수(Recursion)*라고 합니다. 재귀함수는 알고리즘을 수식(특히, 점화식 형태의 수식) 그대로 코드로 작성할 때 많이 사용합니다. 그만큼 직관적이고 가독성이 높다는 장점이 있죠. 하지만 연산이 많아지면 Stack Overflow가 발생할 수 있습니다.