2017-05-29 34 views
1

我想在Lisp中编写深度反转函数,只依赖Lisp提供的原始反转函数以及其他一些常见的东西。我认为它使用的地图,比如是那种比较容易做到这一点:Lisp中的深度反转函数

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

但是关于不使用这些地图,或其他结构的东西。仅仅依靠的东西,如ifreverseappendnullnillistp,​​,conscarcdr等基本的东西。我可以这样做一个级别的反向,像这样:

(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))

回答

5

你几乎有:

(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)) 

我需要做出一些改变相比,你的版本:carcdr

  1. 呼叫deep-reverse
  2. 使用nconc而不是append来避免不必要的顾虑。
  3. reverse重命名为deep-reverse
  4. 分支递归consp,而不是null