当输入((1 2)(3 4))列表时,我想要反转它,但不是这样((3 4)(1 2)),这是反向的,所以我是试图写一个深度逆转的程序:
(define (deep-reverse l)
(cond ((null? l) nil)
(not (pair? (car l)) l)
(else (append (deep-reverse (cdr l)) (list (car l))))))
但它只是抛回((1 2)(3 4))。出了什么问题,如何让它发挥作用?
答案 0 :(得分:3)
尝试:
(define (deep-reverse l) (map reverse l))
以上是最简单的答案;一个真正的答案取决于你期望的深度逆转。请参阅我对您问题的评论。
如果你想要一切,一直向下:
(define (deep-reverse l)
(if (list? l)
(reverse (map deep-reverse l))
l))
以下是它的工作原理(正确):
> (deep-reverse '(1 2 ((3.1 3.2) (4) "abc")))
(("abc" (4) (3.2 3.1)) 2 1)
答案 1 :(得分:0)
您还必须深度反转代码中的car
。否则你不会深深地扭转列表中最前面的部分。
(define (deep-reverse l)
(cond ((null? l) nil)
(not (pair? (car l)) l)
(else (append (deep-reverse (cdr l)) (list (deep-reverse (car l)))))))
答案 2 :(得分:0)
良好的开端是适用于列表的反向过程。然后修改它以递归方式应用于列表中的每辆车:
(define (reverse x)
(define (go items tail)
(if (null? items) tail
(go (cdr items) (cons (car items) tail))))
(go x ()))
(define (deep-reverse x)
(define (go items tail)
(cond ((null? items) tail)
((not (pair? items)) items)
(else (go (cdr items) (cons (go (car items) ()) tail)))))
(go x ()))
深度逆转的应用是:
(define x (list (list 1 (list 2 3) 4) 5 6 (list 7 8) 9 10)) (display x) (deep-reverse x)
((1 (2 3) 4) 5 6 (7 8) 9 10)
=> (10 9 (8 7) 6 5 (4 (3 2) 1))