尾递归函数

Kotlin支持一种函数式编程,即所谓的“尾递归”。这种特性允许一些使用循环的算法改为使用递归实现,但是避免栈溢出。当一个函数被标记为tailrec和满足所需的编译器优化出递归形式,只留下一个基于版本的快速和高效的循环。

tailrec fun findFixPoint(x: Double = 1.0): Double
= if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))

该函数的等价形式为

private fun findFixPoint(): Double {
    var x = 1.0
    while (true) {
        val y = Math.cos(x)
        if (x == y) return y
        x = y
    }
}

为了使用tailrec修饰符,函数必须在最后一个操作中调用自身。当有更多的代码在递归调用之后时不能使用尾递归。不能在try / catch / finally块使用。目前尾递归在JVM中只支持后端。

results matching ""

    No results matching ""