关于两个函数的堆栈溢出

时间:2014-03-19 18:33:57

标签: lisp clisp

所以我是lisp的新手,我对我遇到的问题感到很困惑:

(defun factorial (x)
  (if (>= x 1)
      (* x (factorial (- x 1)))
      1))

阶乘功能可以输出3000!没问题,但是

(defun sum (x)
  (if (<= x 1)
      1
      (+ x (sum (- x 1)))))

堆栈溢出(sum 10000),我正在使用clisp。

有人可以澄清为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

你的函数不是尾递归的,所以编译器(和解释器)会为每次迭代增加堆栈,最终耗尽它。

您的选项在FAQ How do I avoid stack overflow?中列举;相关的是:

  1. 编译功能
  2. 增加Lisp堆栈大小
  3. 使用迭代重写而不是递归
  4. 使用tail-recursion重写并编译