재귀와 TCO

Y·2020년 9월 5일
0

자바스크립트

목록 보기
16/20

TCO 란 ?


Tail Call Optimization 의 약자이다. Tail Call 방식으로 짜여지면 Stack을 새로 만들지 않고 이미 있는 Stack 속의 값만 대체해서 Stack을 재사용하는 방식으로 동작하도록 최적화 할 수 있다. 이러한 최적화를 Tail Call Optimization(또는 Tail Call Elimination)이라고 하며 언어의 실행 환경에서 지원해줘야 한다.

Tail Call 이란?


아주 유명한 재귀 예제인 팩토리얼을 보자.

function factorial(n) {
  if (n <= 1) return 1;
  return n * factorial(n - 1);
}

console.log(factorial(5)); // 120

factorial 함수를 n 번 호출하여 결과를 얻는다. 모든 호출은 factorial 함수를 콜스택에 추가한다. 자바스크립트에서는 재귀를 피하는것이 일반적이다. 함수가 한번 호출될 때 콜스택에 쌓이는데, 너무 많은 재귀가 발생하면 콜스택이 너무 커져에러가 발생한다. 이를 해결하기 위해서 Tail Call 을 사용한다. Tail Call 을 이용하여 스택을 증가시키지 않고 함수를 실행한다. 항상 마지막에 실행되며, return문 직전에 평가되고, 호출된 함수의 결과값이 호출하는 함수의 결과값으로 변환된다. 재귀함수에 사용할 때는, 다음 호출을 할 때 모든 상태를 넘겨주어 이전 프레임을 제거 한다. 스택 메모리를 줄일 수 있는 장점이 있다.

function factorial(n, total = 1){
    if(n === 0){
        return total;
    }
    return factorial(n - 1, n * total);
}

console.log(factorial(3));
profile
연세대학교 산업공학과 웹개발 JavaScript

0개의 댓글