๐ย Reference
๐ย Chapter
โฃ
BST (Binary Search Tree)
TCO (Tail Call Optimization)
- TCO
- Tail Call Optimization
- JavaScript ๋ช
์ธ(ES6)์ TCO(Tail Call Optimization)๊ฐ ํฌํจ๋ ์ง ๊ฝค ์ค๋ ์๊ฐ์ด ํ๋ ์ง๋ง ์ฌ์ค์ Safari(WebKit)๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ฃผ์ ๋ธ๋ผ์ฐ์ ์์ง(V8, SpiderMonkey ๋ฑ)์ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ์ง ์๊ฑฐ๋ ํฌ๊ธฐํ ์ํ์ด๋ค.
TCO๊ฐ ์ธ๋ฉด๋ฐ๋ ์ฃผ์ ์ด์
- ์ด๋ก ์ ์ผ๋ก๋ ์คํ ํ๋ ์์ ์ฌ์ฌ์ฉํด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ผ๋ ์ข์ ๊ธฐ๋ฅ์ด์ง๋ง, ๋ธ๋ผ์ฐ์ ์ ์กฐ์ฌ๋ค์ ๋ค์๊ณผ ๊ฐ์ ์ฐ๋ ค๋ฅผ ํ๊ณ ์๋ค.
- ๋๋ฒ๊น
์ ์ด๋ ค์: ์คํ ํ๋ ์์ด ์ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์, ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋๋ฅผ ๊ฑฐ์ณ์๋์ง ๋ณด์ฌ์ฃผ๋ Error Stack Trace๊ฐ ์ ์ค๋๋ค. ๊ฐ๋ฐ์ ์
์ฅ์์๋ "๋ฒ์ธ"์ ์ฐพ๊ธฐ ํ๋ค์ด์ง๋ค.
- ๊ตฌํ์ ๋ณต์ก๋: V8 ์์ง ํ์ TCO๋ฅผ ๊ตฌํํ์ ๋ ์ป๋ ์ด๋๋ณด๋ค, ๊ทธ๋ก ์ธํด ๋ณต์กํด์ง๋ ์ฝ๋ ๊ด๋ฆฌ์ ์ฑ๋ฅ ์ต์ ํ์ ๋์ด๋๊ฐ ๋ ๋๋ค๊ณ ํ๋จํ๋ค.
TCO ์์ด ์ฌ๊ท๋ฅผ ์์ ํ๊ฒ ์ฐ๋ ๋ฒ (Trampoline)
- TCO๊ฐ ์ ๋๋ค๊ณ ์ฌ๊ท๋ฅผ ํฌ๊ธฐํ ์ ์๋ค. Stack Overflow๋ฅผ ํผํ๊ธฐ ์ํด JavaScript ๊ฐ๋ฐ์๋ค์ ๋ณดํต Trampoline ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
- ํจ์๋ฅผ ๋ฐ๋ก ์คํํ๋ ๊ฒ ์๋๋ผ, ํจ์๋ฅผ ๋ฐํํ๊ฒ ํด์
while ๋ฃจํ ์์์ ํ๋์ฉ ๊บผ๋ด ์ฐ๋ ๋ฐฉ์์ด๋ค.
// ํธ๋จํ๋ฆฐ ํจ์ ์์
const trampoline = fn => (...args) => {
let result = fn(...args);
while (typeof result === 'function') {
result = result();
}
return result;
};
// ํฉํ ๋ฆฌ์ผ ์์
const factorialFn = (n, acc = 1) => {
if (n <= 1) return acc;
return () => factorialFn(n - 1, n * acc); // ํจ์ ์์ฒด๋ฅผ ๋ฐํ
};
const safeFactorial = trampoline(factorialFn);
console.log(safeFactorial(100000)); // ์คํ ์ค๋ฒํ๋ก์ฐ ์์ด ๊ณ์ฐ ๊ฐ๋ฅ