函数调用堆栈溢出

时间:2019-10-10 17:22:31

标签: common-lisp stack-overflow franz-lisp

运行代码时,我收到以下错误消息。下面的代码添加了非nil的元素。

(summit2 '(0 nil 1 2))

Error: Received signal number -3 (function call stack overflow (delayed response))
[condition type: ASYNCHRONOUS-OPERATING-SYSTEM-SIGNAL]

我尝试用nil更改null。我还尝试使用eq而不是eql。

(defun summit2 (lst)
    (if (eql (car lst) null)
        (summit2 (cdr lst))
      (+ (car lst) (summit2 (cdr lst)))))

预期输出应为3,即列表中不为nil的元素之和

2 个答案:

答案 0 :(得分:2)

首先,应使用const [name, setName] = useState('John') setName('New name') const [email, setEmail] = useState('john@john.pl') setEmail('New email') 函数对nil进行检查,因此您的情况是NULL。其次,您的递归缺少基本情况(由于无限递归而导致的错误表明堆栈溢出)。现在,您仅区分下一个元素是(null (car lst))还是非nil。您需要第三种情况来处理空列表。这建议使用nil。例如,您可以执行以下操作:

COND

答案 1 :(得分:2)

一些评论

  • 您可以拼写列表list,而无需将其缩写为lst
  • 代码中的所有分支都导致对summit的递归调用,在任何情况下都不会停止计算结果。这种无限的计算会占用堆栈空间,这就是为什么它最终会因堆栈溢出而停止。
  • 请以常规方式缩进代码(例如,阅读this style guide

请注意,元素为nil的情况与输入列表为空的情况没有太大不同。使用以下代码,两者的处理方式相同:

(defun sum (val)
  (if (consp val)
      (+ (sum (car val))
         (sum (cdr val)))
      (or val 0)))

这也意味着代码可以完成超出预期的工作,即您可以对树中的数字求和:

(sum '(0 1 2 nil 4 5 7 (1 2)))
=> 22

当输入只是一个数字时,它也可以工作:

(sum 5)
=> 5