末尾再帰を意図した関数には @scala.annotaition.tailrec を付けるとコンパイル時にチェックがかかるようになることを知りました。 またこのアノテーションによってIntelliJ IDEAも末尾再帰になっていないときに警告を出してくれます。

たとえば階乗を計算する関数は次のように書いてあげればよさそうです。

もし末尾再帰になっていないときは次のような挙動になります。

末尾再帰なコードはコンパイル後にwhileループに置き換えられるためにコールスタックを消費せずにすみます。 普段Scalaのコードを書くとき、全く意識していなかったので気を付けたいと思います。

なお、2015年5月現在の情報ではJavaのコードは末尾再帰にしてもしなくてもコンパイラが吐くバイトコードは変わらないそうです。 Stream APIでがんばりましょう。そのうち対応してくれるんじゃないでしょうか(遠い目)。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です