generated at
末尾呼び出しの除去
tail call elimination
Call Stackの話を理解してないと理解できないと思うmrsekut
末尾呼び出しの除去を行うことで、Call Stackを積まずに末尾呼び出しを呼べる
そのためStack Over Flowを防止することに繋がる
1つの関数においてはそれほどありがたみがないが、対象が再帰関数だと大きな効能が得られる
このページでは再帰関数であることは前提しないものとして記述する



こういう末尾呼び出しを考えたとき
js
const f = () => { ... return g(); }
f の返り値は、 g の返り値である
よって、 g を呼び出した後は、 f スタックフレームは不要になる
よって、 g の呼び出し時に新たにスタックフレームを追加する必要がない
スタックフレームを積まずに g に移行し、 g リターンアドレスは、 f のものを引き継ぐ
普通ならここで g 用のスタックフレームを作るが、これを作らないことを「末尾呼び出しの除去」と呼ぶ





たすかったmrsekutmrsekut
コールスタックの具体例もあってわかりやすい