Kotlin Tips(2) 用遞歸仍是循環?也許Kotlin能夠給你新的體驗

遞歸OR循環

當編寫一個涉及遞歸調用的方法時,你是否遇到過這樣的煩惱,用遞歸的話更容易理解整個方法所表達的含義和流程,可是爲了去避免出現過多的遞歸調用致使StackOverFlow,你不得不放棄使用遞歸,默默地將代碼修改成循環的形式。 那麼,有沒有可能讓個人代碼保持遞歸的形式可是執行的過程倒是循環的方式呢,是否是以爲這個想法有點天真,可是Kotlin的使用者是可能有這個運氣能實現的。json

tailrec

一切要從優JsonToKotlin(開源庫 json > kotli data class)的代碼提及,這代碼的某個類中,發現了很多的遞歸調用,以下: markdown

而後忽然腦子裏飄過三個字"尾遞歸",尾遞歸就是若是一個函數中全部遞歸形式的調用都出如今函數的末尾,咱們稱這個遞歸函數是尾遞歸的。而尾遞歸優化就是針對尾遞歸的狀況,經過編譯時自動轉換成循環去消除遞歸,從而既保留了代碼的遞歸可讀性又解決了棧空間的問題。介於以前我是知道JAVA是不支持尾遞歸優化的,因此我開始查找Kotlin是否有尾遞歸的優化。函數

很容易在官方文檔找到尾遞歸優化的關鍵字:tailrec優化

tailrec marks a function as tail-recursive (allowing the compiler to replace recursion with iteration)spa

驗證

因而我開始了實驗, 先編寫符合尾遞歸形式的代碼,經過對kotlin代碼的字節碼DEcompile對比查看是否達到了尾遞歸的優化。 3d

經過對比,不難發現tailrec的的確確作到了JAVA作不到的事情。code

相關文章
相關標籤/搜索