Lisp中的深度反转功能

时间:2017-05-29 17:34:50

标签: lisp common-lisp

我想在Lisp中编写一个深度反向函数,只依赖于Lisp提供的原始反向函数,以及其他一些常见的东西。我认为使用地图更容易,例如:

(defun deep-reverse (list)
  (if (listp list)
      (mapcar #'deep-reverse
              (reverse list))
      list))

但是如果不使用这些地图或其他结构呢?只需依靠ifreverseappendnullnillistpatom等内容,{ {1}},conscar等基本内容。我可以做一个级别的反向,像这样:

cdr

但是如何才能实现深度反转?深度反转的意思是,如果函数的输入为(defun reverse (list) (if (null list) 'nil (append (reverse (cdr list)) (cons (car list) 'nil)))) ,则输出应为((1 2 3) (4 5 6))

1 个答案:

答案 0 :(得分:6)

你快到了:

(defun deep-reverse (list)
  (if (consp list)
      (nconc (deep-reverse (cdr list))
             (list (deep-reverse (car list))))
      list))
(deep-reverse  '((1 2 3) (4 5 6)))
==> ((6 5 4) (3 2 1))

与您的版本相比,我需要做一些更改:

  1. deep-reversecar上致电cdr
  2. 使用nconc代替append以避免不必要的行为。
  3. reverse重命名为deep-reverse
  4. consp上的分支递归,而不是null