使用ONLY原语的Lisp反向函数

时间:2014-12-11 05:02:48

标签: lisp reverse

我遇到了一些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)))))

请让我知道如何改善这一点。这不是作业,我只是把它当作明天最后的练习。

3 个答案:

答案 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)))))