当编写一个涉及递归调用的方法时,你是否遇到过这样的烦恼,用递归的话更容易理解整个方法所表达的含义和流程,可是为了去避免出现过多的递归调用致使StackOverFlow,你不得不放弃使用递归,默默地将代码修改成循环的形式。 那么,有没有可能让个人代码保持递归的形式可是执行的过程倒是循环的方式呢,是否是以为这个想法有点天真,可是Kotlin的使用者是可能有这个运气能实现的。json
一切要从优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