use*_*267 2 lisp recursion list
如何反转列表,使每个子列表也反转?这是我到目前为止:
(defun REV (L)
(cond
((null L) nil)
((listp L)
(append
(REV (cdr L))
(list (car L))))
(t
(append
(REV (cdr L))
(list (car L))))))
Run Code Online (Sandbox Code Playgroud)
你是在正确的轨道,但你的最后两个条件有相同的行动,这应该表明其中一个没有做它应该做的事情.实际上,第二个条件,listp情况是不对的,因为当它是一个列表时,你需要附加该列表的反向而不是未修改的列表.可能的解决方案:
(defun reverse (l)
(cond ((null? l) nil)
((listp (car l)) (append (reverse (cdr l))
(list (reverse (car l)))))
(t
(append (reverse (cdr l))
(list (car l))))))
> (reverse '((1 2 3) (4 5 6)))
((6 5 4) (3 2 1))
Run Code Online (Sandbox Code Playgroud)
如您所见,唯一的区别是您测试第一个元素是否为列表,如果是,则在追加第一个元素之前将其反转.