递归
Lisp 经常用于教育环境中,学生学习理解并实现递归算法。
用 Common Lisp 或可移植代码编写的生产代码有几个递归问题:它们没有使用特定于实现的特性,如尾调用优化,通常需要完全避免递归。在这些情况下,实现:
- 由于堆栈大小的限制,通常具有递归深度限制。因此,递归算法仅适用于有限大小的数据。
- 不要总是提供尾调用的优化,尤其是与动态范围操作相结合。
- 仅在某些优化级别提供尾调用的优化。
- 通常不提供尾调用优化。
- 通常不在某些平台上提供尾调用优化。例如,JVM 上的实现可能不会这样做,因为 JVM 本身不支持尾调用优化。
用跳转替换尾调用通常会使调试变得更加困难; 添加跳转将导致堆栈帧在调试器中变得不可用。作为 Common Lisp 提供的替代方案:
- 迭代构造,如
DO
,DOTIMES
,LOOP
等 - 高阶函数,如
MAP
,REDUCE
等 - 各种控制结构,包括低级
go to