Tail Call Optimization
의 약자이다. Tail Call 방식으로 짜여지면 Stack을 새로 만들지 않고 이미 있는 Stack 속의 값만 대체해서 Stack을 재사용하는 방식으로 동작하도록 최적화 할 수 있다. 이러한 최적화를 Tail Call Optimization(또는 Tail Call Elimination)이라고 하며 언어의 실행 환경에서 지원해줘야 한다.
아주 유명한 재귀 예제인 팩토리얼을 보자.
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));