尾递归函数
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中只支持后端。