【学習kotlinシリーズ】tailrecで末尾再帰

2017年6月2日

Qiitaでことりん学習帳を発売しています!

Kotlinは末尾再帰と呼ばれる、簡単に関数の再帰処理を実装できる機能がある。書き方はメソッドの前に「tailrec」をつけて、関数の末尾に再帰処理をするために自分自身の関数を呼び出す形式にするだけ。
以下、実装例。

実装例

/**
 * Created by umentu on 2017/05/29.
 */
class Rational(val n: Int, var d: Int){

    init {
        // 分母が0のとき例外を投げる
        require(d != 0, {"denominator must not be null"})
    }

    // 最大公約数を計算する
    private val g = gcd(Math.abs(n), Math.abs(d))

    // 分子、分母を最大公約数で割る
    val num: Int = n / g
    val den: Int = d / g

    // toStringをオーバーライドして分数を返す
    override fun toString(): String = "${num}/${den}"

    // 再帰的に最大公約数を求める
    tailrec private fun gcd(a: Int, b: Int): Int =
            if ( b == 0 ) a
            else gcd(b, a % b)
}

fun main(args: Array<String>){
    var half = Rational(4, 200)
    println(half)
}

実行結果

1/50

この例だとループ回数が少ないため実行速度にそれほど影響がないが、tailrecを使うことでコンパイラが高速にループを実行してくれるとのこと。