遞迴

Lisp 經常用於教育環境中,學生學習理解並實現遞迴演算法。

用 Common Lisp 或可移植程式碼編寫的生產程式碼有幾個遞迴問題:它們沒有使用特定於實現的特性,如尾呼叫優化,通常需要完全避免遞迴。在這些情況下,實現:

  • 由於堆疊大小的限制,通常具有遞迴深度限制。因此,遞迴演算法僅適用於有限大小的資料。
  • 不要總是提供尾呼叫的優化,尤其是與動態範圍操作相結合。
  • 僅在某些優化級別提供尾呼叫的優化。
  • 通常不提供尾呼叫優化
  • 通常不在某些平臺上提供尾呼叫優化。例如,JVM 上的實現可能不會這樣做,因為 JVM 本身不支援尾呼叫優化

用跳轉替換尾呼叫通常會使除錯變得更加困難; 新增跳轉將導致堆疊幀在偵錯程式中變得不可用。作為 Common Lisp 提供的替代方案:

  • 迭代構造,如 DODOTIMESLOOP
  • 高階函式,如 MAPREDUCE
  • 各種控制結構,包括低階 go to