资讯动态

第120篇 tailrec 与尾递归:递归优化的编译期支持

发布时间:2026/10/8 23:43:52 来源:尧图企业网站定制
tailrec是 Kotlin 里最短的修饰符之一,但它背后牵扯的三件事——尾调用优化(TCO)、JVM 是否有尾调用消除、编译期改写为循环——每一条都能问出深度。这一节按"语言保证 vs 平台现实"两条线讲清,因为只答"编译器会转成循环"是不够的。先把结论放在前面:tailrec是 Kotlin 的编译期优化承诺。当函数体的最后一句是调用自身(或另一个被tailrec修饰的函数)时,编译器把这层递归改写为循环,从而不会真的压栈。三个前提缺一不可:①修饰tailrec;②递归调用是尾调用(之后没有任何语句);③函数有对应的可改写形态(suspend/inline的部分情形不支持)。在 JVM 上,这纯粹是 Kotlin 编译器的功劳——JVM 本身没有尾调用消除。机制背后的执行路径先看为什么尾递归会爆栈。普通递归每次调用都压一个栈帧,栈空间有限:fun sum(n: Int): Int = if (n == 0) 0 else n + sum(n - 1) // 尾调用,JVM 不优化 → 栈溢出 fun sumUnsafe(n: Int, acc: Int = 0): Int = if (n == 0) acc else sumUnsa

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑