Programming Interviews Exposed (第 3 版) で再帰について読みました。そこでは、次の再帰factorial
関数が提示されています。
int factorial(int n){
if (n > 1) { /* Recursive case */
return factorial(n-1) * n;
} else { /* Base case */
return 1;
}
}
同じページの下部 (108 ページ) で、末尾再帰関数について説明しています。
上記の の定義のように、再帰呼び出しによって返される値自体がすぐに返される
factorial
場合、関数は末尾再帰であることに注意してください。
しかし、これは本当にここに当てはまりますか?関数の最後の呼び出しは*
呼び出しなので、このスタック フレームは保持されませんか (コンパイラの最適化を考慮しない場合)。これは本当に末尾再帰ですか?