List 向列表的最后一个索引添加值(LISP)
我正在尝试将给定变量List 向列表的最后一个索引添加值(LISP),list,lisp,common-lisp,List,Lisp,Common Lisp,我正在尝试将给定变量x添加到列表L。这两个参数都是函数ADDV的参数。我目前掌握的守则如下: (defun addV(L x) (cond ((eq L nil) nil) ((eq (cdr L) nil) (list(+(car L) x))) (+ x (first(last L))) (butlast L) (append L x) ) ) 使用参数 L = '(1 2 3 4) x =
x
添加到列表L
。这两个参数都是函数ADDV
的参数。我目前掌握的守则如下:
(defun addV(L x)
(cond
((eq L nil) nil)
((eq (cdr L) nil) (list(+(car L) x)))
(+ x (first(last L)))
(butlast L)
(append L x) ) )
使用参数
L = '(1 2 3 4)
x = 2
当语句:(+x(first(last L)))
被计算时,它的值是4
。最终目标应该是
L='(1236)
我不确定我做错了什么。任何帮助都将不胜感激。谢谢 您的代码格式不正确。重新缩进,我们得到
(defun addV(L x)
(cond
((eq L nil)
nil)
((eq (cdr L) nil)
(list (+ (car L) x)))
(+
x
(first (last L)))
(butlast
L)
(append
L
x) ) )
你现在看到问题了吗
由于(not+)
是NIL
,因此在表单中输入相应的子句。它的身体形态(x
和(第一个(最后一个L))
)会被评估效果,但没有效果。然后返回最后一个表单的值
你显然想要的是
(defun addV (L x)
(cond
((eq L nil)
nil)
((eq (cdr L) nil)
(list (+ (car L) x)))
(T
(append
(butlast L)
(list (+ x (first (last L))))))))
巧合的是,第2条完全没有必要,可能只是被省略了,使之成为可能
(defun addV (L x)
(if (not (null L))
(append (butlast L)
(list (+ x (first (last L)))))))
你的代码格式不正确。重新缩进,我们得到
(defun addV(L x)
(cond
((eq L nil)
nil)
((eq (cdr L) nil)
(list (+ (car L) x)))
(+
x
(first (last L)))
(butlast
L)
(append
L
x) ) )
你现在看到问题了吗
由于(not+)
是NIL
,因此在表单中输入相应的子句。它的身体形态(x
和(第一个(最后一个L))
)会被评估效果,但没有效果。然后返回最后一个表单的值
你显然想要的是
(defun addV (L x)
(cond
((eq L nil)
nil)
((eq (cdr L) nil)
(list (+ (car L) x)))
(T
(append
(butlast L)
(list (+ x (first (last L))))))))
巧合的是,第2条完全没有必要,可能只是被省略了,使之成为可能
(defun addV (L x)
(if (not (null L))
(append (butlast L)
(list (+ x (first (last L)))))))
如果可以进行破坏性操作,则可以使用
incf
和last
:
(defun increment-last (list x)
(prog1 list ; return the list
(incf (first (last list)) x)))
(defun plus-last (list x)
(maplist (lambda (list)
(if (endp (rest list))
(+ x (first list))
(first list)))
list))
如果确实需要创建一个新列表,则必须走到列表的末尾才能找到最后一个元素。在这样做的同时,您可以跟踪您已经看到的元素(以相反的顺序),并有效地使用该相反的顺序列表为您构建新的列表,使用:
如果您对do
语法不太熟悉,也可以使用尾部递归函数(一些常见的Lisp实现可以将其优化为循环):
您还可以使用循环
,非常清楚地表达逻辑:
(defun plus-last (list x)
(loop for (a . b) on list
if (null b) collect (+ a x)
else collect a))
也可以通过maplist
:
(defun increment-last (list x)
(prog1 list ; return the list
(incf (first (last list)) x)))
(defun plus-last (list x)
(maplist (lambda (list)
(if (endp (rest list))
(+ x (first list))
(first list)))
list))
如果可以进行破坏性操作,则可以使用
incf
和last
:
(defun increment-last (list x)
(prog1 list ; return the list
(incf (first (last list)) x)))
(defun plus-last (list x)
(maplist (lambda (list)
(if (endp (rest list))
(+ x (first list))
(first list)))
list))
如果确实需要创建一个新列表,则必须走到列表的末尾才能找到最后一个元素。在这样做的同时,您可以跟踪您已经看到的元素(以相反的顺序),并有效地使用该相反的顺序列表为您构建新的列表,使用:
如果您对do
语法不太熟悉,也可以使用尾部递归函数(一些常见的Lisp实现可以将其优化为循环):
您还可以使用循环
,非常清楚地表达逻辑:
(defun plus-last (list x)
(loop for (a . b) on list
if (null b) collect (+ a x)
else collect a))
这也可以通过maplist
完成:
(defun increment-last (list x)
(prog1 list ; return the list
(incf (first (last list)) x)))
(defun plus-last (list x)
(maplist (lambda (list)
(if (endp (rest list))
(+ x (first list))
(first list)))
list))
如果你从(1234)到(1236),你似乎不想增加太多而想替换。啊,我读错了,你想给最后一个元素添加一个值,然后替换。如果你从(1234)到(1236),你似乎不想增加太多而想替换。啊,我读错了,你想给最后一个元素添加一个值,然后替换。哦,是的,我知道了。谢谢你的帮助!哦,是的,我知道了。谢谢你的帮助!