繁体   English   中英

Kotlin递归

[英]Kotlin recursion

fun fact(x: Int): Int{
    tailrec fun factTail(y: Int, z: Int): Int{
        if (y == 0) return z
        else return factTail(y - 1, y * z)
    }
    return factTail(x, 1)
}

有人可以向我解释一下上面的递归函数在kotlin中是如何工作的吗?

我将开始说tailrec关键字仅用作编译器的优化,它将尝试用循环表示函数而不用递归来避免堆栈溢出的风险。

如果我们避免递归,函数可能会看起来像这样:

 fun fact(x: Int): Int {
    var result = x
    for (i in x - 1 downTo 1) {
        result *= i
    }
    return result
 }

在Java中使用递归时存在很大的风险,即stackoverflow。

如上所述,链接递归在Java中有效。 堆栈会有一些最大大小,如果我们的递归函数变为无穷大,那么它将超过最大大小并导致StackOverflow异常。 因此,请避免使用递归并使用循环

来到当前的问题。 这是一个特殊的递归,它是Tail调用 在那个函数上,函数必须将自己称为它执行的最后一个操作。 可以在不向调用堆栈添加新堆栈帧的情况下实现尾调用。 因此StackOverflow不会有任何风险。 它在kotlin中得到了支持。

在Kotlin中,它使用tailrec修饰符来显示这种特殊的递归。 当递归调用后有更多代码时,您不能使用尾递归,并且您不能在try / catch / finally块中使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM