Lisp反向“全部”功能

时间:2010-12-07 07:07:15

标签: recursion map lisp reverse

我想在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).. 任何帮助表示赞赏!

3 个答案:

答案 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))))