Lisp语言中的深度反转函数

Lisp语言中的深度反转函数,lisp,common-lisp,Lisp,Common Lisp,我想用Lisp编写一个深度反转函数,只依赖Lisp提供的原始反转函数和其他一些常见的东西。我认为使用地图更容易做到这一点,例如: (defun deep-reverse (list) (if (listp list) (mapcar #'deep-reverse (reverse list)) list)) 但如果不使用这些地图或其他结构呢。只需依靠一些基本的东西,比如if,reverse,append,null,nil,listp,at

我想用Lisp编写一个深度反转函数,只依赖Lisp提供的原始反转函数和其他一些常见的东西。我认为使用地图更容易做到这一点,例如:

(defun deep-reverse (list)
  (if (listp list)
      (mapcar #'deep-reverse
              (reverse list))
      list))
但如果不使用这些地图或其他结构呢。只需依靠一些基本的东西,比如
if
reverse
append
null
nil
listp
atom
cons
car
cdr
,等等。我可以做一个一级反转,像这样:

(defun reverse (list)
  (if (null list)
     'nil
      (append (reverse (cdr list))
              (cons (car list) 'nil))))
但我如何才能实现像这样的深度反转呢?我所说的深度反转的意思是,如果函数的输入是
((1 2 3)(4 5 6))
,那么输出应该是
((6 5 4)(3 2 1))
,您就快到了:

(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))
与您的版本相比,我需要做一些更改:

  • car
    cdr
    上调用
    deep reverse
  • 使用而不是避免不必要的考虑
  • reverse
    重命名为
    deep reverse
  • consp
    上的分支递归,而不是
    null
  • 你就快到了:

    (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))
    
    与您的版本相比,我需要做一些更改:

  • car
    cdr
    上调用
    deep reverse
  • 使用而不是避免不必要的考虑
  • reverse
    重命名为
    deep reverse
  • consp
    上的分支递归,而不是
    null