我遇到了一些lisp代码问题。该函数只是用于反转基本列表。 我只能使用定义为的原语 “defun,cond,cons,car,cdr,null,eq,listp,atom,symbolp,+, - ,<,>”
在传球的例子中(1 2 3 4)我回来了(((4 3)2)1)
(defun reverse2 (l)
(cond
((eq nil (cdr l)) (car l) )
(t (cons(reverse2 (cdr l)) (cons (car l) nil)))))
请让我知道如何改善这一点。这不是作业,我只是把它当作明天最后的练习。
答案 0 :(得分:1)
要实现反向功能,需要使用累加器。以下是您可以实现的方法(在这种情况下,tail
是累加器):
(defun revappend (list tail)
(cond ((null list) tail)
(t (revappend (cdr list) (cons (car list) tail)))))
然后,根据reverse
:
revappend
(defun reverse (list)
(revappend list nil))
答案 1 :(得分:0)
如果您想使用简单递归,则必须将第一项附加到列表的末尾。请注意,这不是列表反向操作的良好实现。为什么呢?
(defun reverse2 (l)
(cond ((endp l) l)
(t (append (reverse2 (rest l))
(list (first l))))))
REVERSE
CL-USER> (reverse2 '(a b c d))
(D C B A)
答案 2 :(得分:0)
您可以使用可选参数:
,而不是使用辅助功能(defun reverse (list &optional tail)
(cond ((null list) tail)
(t (reverse (cdr list)
(cons (car list) tail)))))