递归

Lisp 经常用于教育环境中,学生学习理解并实现递归算法。

用 Common Lisp 或可移植代码编写的生产代码有几个递归问题:它们没有使用特定于实现的特性,如尾调用优化,通常需要完全避免递归。在这些情况下,实现:

  • 由于堆栈大小的限制,通常具有递归深度限制。因此,递归算法仅适用于有限大小的数据。
  • 不要总是提供尾调用的优化,尤其是与动态范围操作相结合。
  • 仅在某些优化级别提供尾调用的优化。
  • 通常不提供尾调用优化
  • 通常不在某些平台上提供尾调用优化。例如,JVM 上的实现可能不会这样做,因为 JVM 本身不支持尾调用优化

用跳转替换尾调用通常会使调试变得更加困难; 添加跳转将导致堆栈帧在调试器中变得不可用。作为 Common Lisp 提供的替代方案:

  • 迭代构造,如 DODOTIMESLOOP
  • 高阶函数,如 MAPREDUCE
  • 各种控制结构,包括低级 go to