我想在lisp中编写一个函数,使用map函数反转列表中的所有元素,但我不知道如何启动它。我想我必须以某种方式使用内置的反向函数.. 例如,如果我有列表(1 2 3(4 5 6(7 8 9)))我会得到(((9 8 7)6 5 4)3 2 1) 或者如果我有清单(1 2 3(4 5)(6 7))我会得到((7 6)(5 4)3 2 1).. 任何帮助表示赞赏!
答案 0 :(得分:4)
快速回答,不确定效率/优雅:
(defun reverse-deeply (list)
(mapcar #'(lambda (li)
(cond
((consp li) (reverse-deeply li))
(t li)))
(reverse list)))
答案 1 :(得分: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,然后反转结果。
答案 2 :(得分:0)
(defun reverse-list (list)
(let ((result nil))
(dolist (e list result)
(push e result))))