2010-12-07 93 views
2

我想在lisp中編寫一個函數,使用映射函數反轉列表中的所有元素,但我不知道如何啓動這個..我想我必須使用built in如果我有清單(1 2 3(4 5 6(7 8 9))),我會得到(((8 8 7)6 5 4)3 2 1) 或如果我有名單(1 2 3(4 5)(6 7))我會得到((7 6)(5 4)3 2 1).. 任何幫助表示讚賞!Lisp反向「全部」功能

+0

從下面您的意見,似乎你所描述的遞歸問題,其中最簡單的解決方案是一個遞歸函數(即自己調用的函數)。出於這個原因,我用「遞歸」標記了這個問題。 – 2010-12-07 07:43:16

回答

4

只是一個快速的答案,不知道效率/優美:

(defun reverse-deeply (list) 
    (mapcar #'(lambda (li) 
       (cond 
       ((consp li) (reverse-deeply li)) 
       (t li))) 
      (reverse list))) 
0

這是一個適用於Common-Lisp的版本。

(defun reverse-list (list) 
    (if (atom list) 
     list ;; Not actually a list, return the atom 
     (reverse (mapcar #'reverse-list list))) 

;; Testing it out 
(reverse-list '((1 2 3) (4 5 (3 6)))) 

輸出:

(((6 3) 5 4) (3 2 1)) 

Mapcar是另需函數作爲第一個參數和一個列表作爲其第二個參數的函數。然後它在列表的每個元素上調用該函數。它返回所有答案的列表。因此,在我使用'mapcar'反轉所有子列表之後,我再次調用'reverse'來反轉更大的列表。

它在每個子列表上調用的函數是'反向列表'。這將檢查列表是否是一個原子。如果是,那麼它會自行返回。如果它是一個列表,那麼它會再次在列表中的每個元素上調用mapcar,然後反轉結果。

+0

這不是我想到的。這個函數顛倒了列表,但是子列表的順序也必須顛倒。 – SnailBoy 2010-12-07 07:19:17

+0

如果有人不知道mapcar是如何工作的,它可能會令人困惑,因爲有兩個實現結果的方法:a)顛倒頂級容器列表; b)反向成員名單:) – khachik 2010-12-07 07:19:26

+0

那好些?對不起,我一定誤解了你的要求。 – 2010-12-07 07:22:50

0
(defun reverse-list (list) 
    (let ((result nil)) 
    (dolist (e list result) 
     (push e result))))