运行代码时,我收到以下错误消息。下面的代码添加了非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的元素之和
答案 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
的递归调用,在任何情况下都不会停止计算结果。这种无限的计算会占用堆栈空间,这就是为什么它最终会因堆栈溢出而停止。请注意,元素为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