末尾再帰
再帰関数の最適化技法の一つ
再帰呼び出しが関数の最後の操作として行われる場合に適用される
末尾再帰は、スタックフレームを積み重ねないため、効率的で深い再帰を実行する際にスタックオーバーフローを防ぐために使用
末尾再帰の特徴
末尾再帰では、再帰呼び出しが関数の最後の操作として行われ、再起が戻ってきた後に何も追加の計算が行われない
通常の再帰では、各再帰呼び出しの際に新しいスタックフレームが積み重なるが、末尾再帰の場合は再帰の途中で新しいスタックフレームを作成せず、前のフレームを再利用する
計算結果をどこかしらに保持することをしないため
サンプルコード
階乗計算処理
code:scala
def factorialTailRec(n: Int, accumulator: Int = 1): Int = {
if (n == 0) accumulator
// 再帰呼び出しが関数の最後に実施される
else factorialTailRec(n - 1, n * accumulator)
}
注意
末尾再帰最適化(Tail Call Optimization TCO)が言語にサポートされているかに依存する