2010-12-07 58 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))))