簡體   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