さっしーブログ

埼玉県在住のシステムエンジニアです。基本的には技術的な内容を中心に発信していきます。

Scala入門 tailrecアノテーションについて

目次

1.tailrecアノテーションとは

末尾再帰関数の最適化が想定される関数に対して使用。
もし、末尾再帰関数の最適化が行われなかった場合にコンパイルエラーを出してくれる。
この最適化とはコンパイル時に末尾再帰関数をループに変換させている。
そのため大きな値が来てもスタックオーバーフローになる危険を回避してくれる。
しかし、この変換が行われない末尾再帰関数もあるそうでその場合はループに変換されないため、大きな値が来た時にスタックオーバーフローが発生するケースができてしまう。

2.末尾再帰関数とは

ちなみに末尾再帰関数とは、関数の最後が再帰関数で終わっているものを末尾再帰関数と呼びます。

サンプルコードを提示するとこんな感じ

  def loop(n: Int, acc: Int): Int = {
    if(n <= 0)
      acc
    else
      go(n-1, n*acc)
  }

以下のサンプルコードの関数は末尾再帰関数とは呼ばない。

  def loop(n: Int, acc: Int): Int = {
    if(n <= 0)
      acc
    else
      1 + go(n-1, n*acc)
  }

違い分かりますでしょうか?

前者は関数の内容が自分自身の呼び出しで終わっているのに対して、
後者は自分を自身を呼び出した後に、その結果と「1」を加算しています。

このような内容の関数は末尾再帰関数とは呼びません。

以上