LISP&rest问题

大师

因此,我是LISP的新手,并且正在使用几个基本的求和函数。

(defun suma (&rest L)
  (cond
    ((null L) 0)
    (T (+ (CAR L) (EVAL (CONS 'suma (CDR L)))))
))


(defun suma2 (&rest L)
  (cond
   ((null L) 0)
   (T (+ (car L) (suma2 (cdr L))))
))

第一个功能工作正常。第二个函数给出此错误:SB-KERNEL :: CONTROL-STACK-EXHAUSTED。

我的问题是:为什么第一个函数正常,而第二个函数根本不在做同样的事情?

sepp2k

如果您打电话,说(suma2 1 2 3)L将是清单(1 2 3)然后(suma2 (cdr L))您将致电,即(suma2 '(2 3))该调用L将是list ((2 3)),即包含单个元素的列表:list (2 3)现在它将(suma2 (cdr L))再次调用,这次(cdr L)是空列表,因此在下一次调用中L是一个包含空列表的列表。由于那仍然是包含一个元素的列表,因此它将再次递归。L永远不会到达空的情况,因为L它将始终是一个仅包含一个元素的列表:的结​​果(cdr L)

因此,您应该更改suma2函数以接受列表而不是可变数量的参数(然后将其称为(suma2 (list 1 2 3))(suma2 '(1 2 3))代替(suma2 1 2 3)),或用于applysuma2列表的内容作为其参数而不是列表本身进行调用

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章