再帰呼び出しはロジックを簡潔に書ける一方で、スタックの深さやパフォーマンスなど考慮すべき点が多くあります。これらの対応のために再帰処理をループなどに展開するのは、煩雑なうえに可読性を損なってしまいます。Kotlinは末尾再帰最適化のためのキーワードを提供しており、コンパイラが再帰呼び出しを最適化してくれます。これにより再帰呼び出しの読みやすさと、スタックやパフォーマンスの問題の両方を解決できます。行うにはtailrecキーワードを使います。リスト1のように関数の先頭にtailrecを付与することで、コンパイラに末尾再帰最適化を指示できます。}Kotlinではtailrecキーワードによる明示的な末尾最適化を行っています。tailrecキーワードを付与していない場合は、関数が末尾再帰をしていてもコンパイラは最適化をしません。これには2つの理由があります1。ひとつはデバッグのためです。末尾再帰最適化されたコードは実際には再帰を行わなくなるため、デバッガによってスタックフレームを見られなくなります。デバッグの際はtailrecを外すなどの明示的な操作で末尾再帰最適化をコントロールできます。ひとつは最適化が可能かどうかを検査するためです。tailrecキーワードを付与した関数を、コンパイラが末尾再帰最適化できないと判断した場合は警告を出してくれます。末尾再帰最適化しているつもりができていない、といったケースを防げます。https://blog.jetbrains.com/kotlin/2013/12/m6-2-available/末尾再帰最適化による処理のループ展開tailrecキーワードの有無によってコンパイル後のコードがどのように変化するか確認してみましょう。リスト2はフィボナッチ数列の特定のindexの値を計算する関数ですtailrecキーワードを付与せず末尾で再帰呼び出しをしています。}デコンパイルをするとリスト3のようになります。var10000;}when式をswitch文に置き換えた以外はほとんど元のコードと同じです。つぎにtailrecキーワードを付与するケースを見てみましょう(リスト4)。}}再帰呼び出しが展開されてwhile文になっています。これによりスタックオーバーフローを気にする必要がなくなりました。最適化を明示的にコンパイラに任せることで、コードの可読性を保つことができています。tailrecキーワードによる末尾再帰最適化は、再帰呼び出しの展開を肩代わりしてコードを簡潔に保つ手助けをしてくれます。