Scala ではコンパイラや JavaVM では最適化されない末尾相互再帰を Trampoline (トランポリン) を使って解決します。また末尾再帰になっていない再帰処理をコールスタックを消費しないで実行するためにも Trampoline を使用します。 C/C++/Java 暦が長いんで末尾最適化されずコールスタック量も想定できない処理は自前でループに書き換えていましたけど、後述する問題を Trampoline で解決できないかなと知識まとめがてらの投稿です。 前提知識: Scala の末尾相互再帰 関数やメソッドの再帰呼び出しはその再帰が処理の一番最後であれば理論的にループ命令に展開できます。これは再帰ごとにその呼び出しのコールスタックをクリアしても問題ないためで、ループの方がコールスタックを消費しないので再帰がどれだけ深くなっても一定量のスタック空間で済む (Stack Overf
![Trampoline で再帰処理の最適化 - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/55839b6f01e64e40e1d73ad89c71c504e5f50fdb/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9VHJhbXBvbGluZSUyMCVFMyU4MSVBNyVFNSU4NiU4RCVFNSVCOCVCMCVFNSU4NyVBNiVFNyU5MCU4NiVFMyU4MSVBRSVFNiU5QyU4MCVFOSU4MSVBOSVFNSU4QyU5NiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9MDFkMzFmMDkzNWI5MmQ5YjMxMGU2YTAwNDNiZjE4ZGY%26mark-x%3D142%26mark-y%3D57%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDB0b3JhbyU0MGdpdGh1YiZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9M2U2YWNhNGQxNzM2MjExYWMzYmJlYTZhMzc4ZGIzMzM%26blend-x%3D142%26blend-y%3D486%26blend-mode%3Dnormal%26s%3D747c129c77a76f05b352479f282c6d59)