迭代 使用循环;递归 使用自调用。它们在功能上是等价的(用一种做的任何事都可以用另一种做),但在清晰度和成本上有所不同。
并排比较
python
():
total =
i (, n + ):
total += i
total
():
n == :
n + sum_rec(n - )
| 方面 | 迭代 | 递归 |
|---|---|---|
| 内存 | O(1) 额外空间 | O(depth) 栈空间 |
| 可读性 | 适合线性工作 | 适合树 / 分治法 |
| 风险 | 无限循环 | 栈溢出 |
| 速度 | 通常更快(无调用开销) | 每帧都有调用开销 |
深度递归存在栈溢出风险;当深度无界时,将热递归代码转换为迭代(通常使用显式栈)。
选择正确的风格可以保持代码既正确又易读。
递归使树和图的代码优雅,但了解其内存成本可以让你避免在深度输入上崩溃。
当面试官要求你"将其转换为迭代"时,这种权衡判断正是他们探究的内容。