知识卡片
尾递归优化避免栈溢出
内容
Kotlin用tailrec修饰符标记尾递归函数,要求递归调用必须是函数体执行的最后一步操作。满足这个条件时,编译器能把递归结构改写成等价的循环,用固定的栈帧空间执行,从而避免普通递归因每层调用都要保留独立栈帧而导致的栈溢出。这个优化只对”调用自身即为最后一步”的形态成立:一旦递归调用后面还跟着额外运算(比如先乘后返回的n * fac(n-1)写法),编译器就无法识别为尾递归,也就做不了这个转换,写法本身决定了能不能被优化。
参考来源
《Kotlin开发快速入门与实战》第4章《Kotlin函数》