a day ago
- 递归对于自然递归问题(树遍历、分治)很优雅,但每次调用都会消耗栈空间,导致深度较大时出现栈溢出。
- 尾调用优化(TCO)理论上可以重用栈帧,但JavaScript运行时很少可靠地实现它;即便是正确的尾递归代码仍然可能溢出。
- 斐波那契示例表明,指数分支和栈溢出是两种不同的故障模式,需要不同的修复方法。
- 一张运行时TCO支持表(2026年5月)显示,Chrome/V8、Node.js、Deno、Firefox、Safari和Bun都缺乏可靠的TCO,因此不能假设可移植性。
- 生产安全的替代方案包括迭代重写和蹦床模式,后者保持递归风格的同时避免栈增长。
- 实用检查清单:永远不要假设TCO,使用实际边界进行测试,对于深层或用户驱动的输入优先使用迭代,仅将递归视为用于自然有界深度的可读性工具。