[JS]나를 부르는 함수 재귀함수

재귀함수(Recursive function)

MDN 문서 바로가기

예시1 팩토리얼

아래는 팩토리얼을 재귀함수로 구하는 예시이다.

const factorial = (n) => {
  if (n === 0) return 1;
  else {
      console.log(`${n} * factorial(${n-1})`)
      return n * factorial(n - 1);
  }
};

위의 식을 콘솔에 찍어보면 아래와 같이 결과가 나오게 된다.

factorial(10)
10 * factorial(9)
9 * factorial(8)
8 * factorial(7)
7 * factorial(6)
6 * factorial(5)
5 * factorial(4)
4 * factorial(3)
3 * factorial(2)
2 * factorial(1)
1 * factorial(0)
3628800

n으로 10을 입력 받았을 때 재귀가 종료가 되는 시점은 n이 0이 되는 시점이고 0이 될때까지 계속 해서 자기 자신을 호출하는 것을 볼 수 있다.

조금 더 풀어 써보면 아해와 같이 스택에 쌓여 있다고 보면 이해가 빠를 듯하다.

stp=9   n=1  일때 : 1 * factorial(0)
stp=8   n=2  일때 : 2 * factorial(1)
stp=7   n=3  일때 : 3 * factorial(2)
stp=6   n=4  일때 : 4 * factorial(3)
stp=5   n=5  일때 : 5 * factorial(4)
stp=4   n=6  일때 : 6 * factorial(5)
stp=3   n=7  일때 : 7 * factorial(6)
stp=2   n=8  일때 : 8 * factorial(7)
stp=1   n=9  일때 : 9 * factorial(8)
stp=0   n=10 일때 : 10 * factorial(9)

stp가 작은 스택이 먼저 쌓인 스택이고 n이 0이 되는 순간에 제일 위에 있는 스택(stp=9)부터 꺼내어 연산을 실행한다.

예시2 피보나치 수열

피보나치 수열도 재귀함수로 간단하게 답을 구할 수 있다.

const fibonacci = (n) => (
  n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2));
console.log(fibonacci(10));

다만 개인적으로 재귀함수로 피보나치 수열을 구한 적이 있었는데, 피보나치수 50 정도만 구하려고 해도 상당한 시간이 소요되었던걸로 기억한다.

재귀함수가 속도면에서는 그렇게 효율적이지 않은 것 같다.