Thief of Wealth
Published 2021. 3. 25. 00:36
꼬리 호출 개발/FrontEnd Interview

Tail Call Optimization 꼬리 호출 최적화

 

- 꼬리 호출함수는 무엇인가요?

꼬리 호출 함수는 함수가 마지막으로 하는 일이, 어떤 함수를 호출해 그 결과를 바로 반환일을 하는 함수를 뜻합니다.

 

예를 들어서 

function func1(any){
	return function func2(greeting, ...args){
    	return greeting(any(...args));
    }
}

같은 경우가 꼬리 호출 함수이다.

 

- 그것이 어떤 장점을 지니고 있나요?

함수는 일반적인 동작을 설명해보겠습니다.

zereight.tistory.com/manage/posts/

위 포스팅에서 중요한 차이점 하나는, 활성 객체가 충분히 크다면 (원래 크지만), 새로운 활성 객체를 할당할 필요가 없다는 것입니다.

즉, 새로운 활성 함수를 할당할 필요 없이, 현재 사용 중인 활성 객체를 재사용할 수 있습니다.

그래서 메모리 할당과 GC에 드는 시간을 줄이는 것에 효과적이라고 할 수 있습니다.

 

또한, 꼬리 호출 최적화를 통해서, 재귀 함수 호출을 반복문만큼 빠르게 만들 수 있습니다.

반복문은 선천적으로 순수하지 않기 때문에,  재귀 함수의 호출이 빠르다는 것은 함수적인 관점에서 아주 중요합니다.

 

순수함은 재귀를 통해서 얻을 수 있는데, 반복문 만큼 빠른 재귀 함수를 만드는 것은, 재귀함수의 성능을 높이고 순수함을 유지한다는 투마리 토끼를 잡는 것과 마찬가지여서 좋습니다.

 

- 다음 중 꼬리 호출이 아닌 것은 무엇인가요?

// 1
return (
	typeof any === 'function' ? any() : undefined
)

// 2
any();
return;


// 3
return 1 + any();

// 4
const value = any();
return value;

// 5
function factorial(n) {
	if(n<2) return 1;
    return n * factorial(n-1);
}

// 6
function factorial(n, result = 1){
	if(n<2) retirn result;
    return factorial(n-1, n*result);
}

// 7
return function () {}

// 8
return (function() {}())

 

함수가 반환하는 값이 바로 반환되는 경우를 꼬리 호출이라고 부릅니다.

 

1번은 꼬리호출입니다.

논리 연산자 &&나 ||를 사용하는 반환 표현식도 꼬리 호출이 될 수 있습니다!

 

2번은 꼬리호출이 아닙니다.

왜냐하면 함수가 아니라 undefined를 반환하기 때문이죠.

 

3번은 꼬리호출이 아닙니다.

함수가 마지막에 하는 일은 더하기의 결과를 반환하는 것이기 떄문이죠.

 

4번은 꼬리호출이 아닙니다. 

역시, 함수의 반환값이 아니라, value를 반환하기 때문이죠. 

물론 value가 함수의 반환값이긴 하지만, 함수 호출이 꼬리 위치가 아닙니다!

 

5번도 꼬리호출이 아닙니다.

반환값이 함수의 반환값에서 * n를 해준것이 반환값이기 떄문이죠.

함수가 끝나고 해야할 일이 남아있기 때문에, 반복 시 매번 활성 레코드를 만들게되어요.

 

6번은 꼬리호출입니다.

활성화 객체를 만들지 않고, 함수 호출의 최상위로 바로 점프시킬 수 있는 코드입니다!.

 

7번은 꼬리호출이 아닙니다.

당연히~ 세로운 함수를 반환하는 것도 꼬리 호출이 아니에요.

 

8번은 꼬리호출입니다.

새로운 함수 객체라도 바로 호출하여 사용한다면 꼬리 호출이에요.

 

 

profile on loading

Loading...