[英]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.