在 Kotlin 中,要定義一個尾遞歸函數,您需要確保函數的最后一個操作是調用自身(遞歸調用),并且不包含任何需要在遞歸調用之后執行的代碼。為了實現這一點,您可以使用兩個關鍵字:tailrec
和 operator
。
tailrec
關鍵字用于指示編譯器該函數是尾遞歸的,這意味著編譯器應該優化遞歸調用以避免棧溢出。operator
關鍵字允許您將函數作為一等公民,以便可以將其用作其他函數的參數或返回值。
以下是一個尾遞歸函數的示例,用于計算階乘:
tailrec fun factorial(n: Int, accumulator: Int = 1): Int {
if (n <= 1) {
return accumulator
} else {
return factorial(n - 1, n * accumulator)
}
}
在這個例子中,factorial
函數接受兩個參數:n
和 accumulator
。accumulator
用于累積計算結果。函數首先檢查 n
是否小于等于 1,如果是,則返回累積器的值。否則,函數進行尾遞歸調用,將 n - 1
和 n * accumulator
作為參數傳遞。注意,遞歸調用是函數的最后一個操作,因此這是一個尾遞歸函數。