末尾呼び出しの除去
tail call elimination
Call Stackの話を理解してないと理解できないと思うmrsekut.icon
末尾呼び出しの除去を行うことで、Call Stackを積まずに末尾呼び出しを呼べる
そのためStack Over Flowを防止することに繋がる
1つの関数においてはそれほどありがたみがないが、対象が再帰関数だと大きな効能が得られる
ref 末尾再帰の最適化
このページでは再帰関数であることは前提しないものとして記述する
こういう末尾呼び出しを考えたとき
code:js
const f = () => {
...
return g();
}
fの返り値は、gの返り値である
よって、gを呼び出した後は、fのスタックフレームは不要になる
よって、gの呼び出し時に新たにスタックフレームを追加する必要がない
スタックフレームを積まずにgに移行し、gのリターンアドレスは、fのものを引き継ぐ
普通ならここでg用のスタックフレームを作るが、これを作らないことを「末尾呼び出しの除去」と呼ぶ
末尾再帰による最適化 - Qiita
たすかったmrsekut.icon*2
コールスタックの具体例もあってわかりやすい