在 Kotlin 中,要避免尾遞歸函數導致的棧溢出,可以使用以下方法:
fun factorial(n: Int): Int {
var result = 1
for (i in 1..n) {
result *= i
}
return result
}
tailrec
關鍵字:在函數聲明前加上 tailrec
關鍵字,Kotlin 編譯器會嘗試優化尾遞歸調用,將其轉換為循環。但是,需要注意的是,tailrec
只能用于尾遞歸的情況,否則編譯器會報錯。tailrec fun factorial(n: Int, accumulator: Int = 1): Int {
if (n <= 1) {
accumulator
} else {
factorial(n - 1, n * accumulator)
}
}
在這個例子中,accumulator
參數用于累積計算結果,每次遞歸調用時都會更新它的值。當 n
減少到 1 時,遞歸結束,返回累積器的值。
總之,雖然 Kotlin 不支持尾遞歸優化,但通過將尾遞歸轉換為循環或使用 tailrec
關鍵字,可以有效地避免棧溢出。