[Kotlin] Kotlinで末尾再帰最適化 その1

2019年1月7日月曜日

Kotlin

Kotlinでは関数にtailrec宣言を付けることによって、末尾再帰最適化がされる(一部制限があるようですが)!とのことなので、早速やってみます。
何はともあれ、フィボナッチ数。

末尾再帰でフィボナッチ数

fibonacci.kt
fun main(args: Array<String>) {
    println(fibonacci(Integer.parseInt(args[0])))
}

fun fibonacci(n: Int): List<Int>
    = if (n <= 1) listOf(1)
      else fibonacci0(n, listOf(1, 1))

tailrec fun fibonacci0(n: Int, list: List<Int>): List<Int>
    = if (list.size >= n) list
      else fibonacci0(n, list.plus(list.takeLast(2).sum()))

$ kotlinc -version
info: kotlinc-jvm 1.3.11 (JRE 1.8.0_92-b14)
$ kotlinc fibonacci.kt -include-runtime -d fibonacci.jar
$ java -jar fibonacci.jar 5
[1, 1, 2, 3, 5]

とりあえず、それっぽく動作していることは確認できた。その2に続く〜