2017-05-29 63 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