所以我对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堆栈大小
用迭代代替递归重写
使用尾部递归重写并编译