2013-12-12 55 views
-1

我設法扭轉的清單,我不能使用功能 「nreverse」反向列表與dolist在LISP

我嘗試:

(defun dolist-reverse (l) 
    (let ((new-list (make-list (length l)))) 
    (dolist (x l new-list) 
     (setf new-list (cons x new-list))))) 

但結果是:

CL-USER>(dolist反向「(1 2 3))

(3 2 1 NIL NIL NIL)

我該怎麼辦? (我需要使用dolist)

編輯:

最後解決我的問題:

(defun dolist-reverse (l) 
    (let ((new-list)) 
    (dolist (x l new-list) 
     (setf new-list (cons x new-list))))) 
+1

如果你找到了一個解決問題的方法,那麼你應該張貼它作爲一個解釋的答案,將其標記接受。 –

回答

-1

這一個讓同樣的事情,在不改變參數的程序;

(defun my-reverse (l) 
    (if (null l) nil 
     (append 
     (my-reverse (cdr l)) 
     (list (car l))))) 
+0

martialp,你爲什麼需要dolist? –

+0

爲什麼追加是一個非常糟糕的主意? –

+0

我之所以這樣做,是爲了顯示算法的存在性,沒有迭代構造,以及簡單的表達列表的反轉,而列表的反轉是列表的其餘部分與列表中的第一個列表相反。 –

3
CL-USER 11 > (defun dolist-reverse (list &aux (reverse-list nil)) 
       (dolist (element list reverse-list) 
       (push element reverse-list))) 
DOLIST-REVERSE 

CL-USER 12 > (dolist-reverse '(1 2 3)) 
(3 2 1)