假設我寫這樣的代碼:科特林:尾遞歸的相互遞歸函數
tailrec fun odd(n: Int): Boolean =
if (n == 0) false
else even(n - 1)
tailrec fun even(n: Int): Boolean =
if (n == 0) true
else odd(n - 1)
fun main(args:Array<String>) {
// :(java.lang.StackOverflowError
System.out.println(even(99999))
}
我怎麼科特林優化這些相互遞歸函數,這樣我就可以不用在拋出StackOverflowError運行main
? tailrec
關鍵字適用於單一函數遞歸,但沒有更復雜的內容。我還看到一個警告,即在使用tailrec
關鍵字的地方找不到尾部呼叫。對於編譯器來說這可能太難了?
您可以將功能請求添加到https://youtrack.jetbrains.com以獲得「互尾遞歸」功能,如果您希望將它添加到Kotlin中,那麼這是最好的選擇。如果它已經被請求或計劃,那麼還要首先在那裏搜索。 –
我在這裏創建了一個Kotlin問題:https://youtrack.jetbrains.com/issue/KT-11307 – denine99