所以我对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。
有人能解释一下为什么会这样吗?

最佳答案

您的函数不是尾部递归的,所以编译器(和解释器)为每次迭代增加堆栈,最终耗尽堆栈。
您的选项在FAQ How do I avoid stack overflow?中列出;相关选项包括:
编译函数
增加Lisp堆栈大小
用迭代代替递归重写
使用尾部递归重写并编译

10-05 20:31
查看更多