CLISP中的反向列表

时间:2016-04-27 16:33:52

标签: functional-programming lisp common-lisp

我正在尝试编写自己的函数来反转LISP中的列表。问题是输入

  

(还原'(2 3(4 5(6))))

我的代码如下所示:

(defun revert (l)
  (if (null l)
    nil
    (append (revert (cdr l)) (list (car l)))))

返回

  

((4 5(6))3 2)

而不是:

  <(>((6)5 4)3 2)

如何修复它才能正常工作?

1 个答案:

答案 0 :(得分:2)

由于您也要反转子列表,因此必须使用REVERT上的CAR以及CDR

(defun revert (l)
  (if (null l)
      nil
      (append (revert (cdr l))
              (list (revert (car l))))))

然而,这要求您处理L可能是原子的可能性,原子应该按原样返回。由于NIL也是一个原子,因此您只需更改条件即可检查ATOM而不是NULL

(defun revert (list)
  (if (atom list)
      list
      (append (revert (cdr list))
              (list (revert (car list))))))

(revert '(2 3 (4 5 (6))))
;=> (((6) 5 4) 3 2)

在Common Lisp中,首选使用完整单词作为名称,因此最好将l list命名为。您还可以将该函数命名为tree-reverse