计划 – 了解深度逆转

说我有清单'(1 2 3(4 5 6)7 8 9).它应该使用下面的代码返回(9 8 7(6 5 4)3 2 1).我试图理解这个迭代过程是如何工作的.显示如何逐步完成这将非常有帮助.

我最困惑的部分是此时调用两次深度反转
           (附加
           (深度反转(cdr lst))
           (列表(深反(汽车))))))

我不知道接下来会发生什么.

(define (deep-reverse lst) 
   (cond ((null? lst) '() ) 
         ((pair? (car lst)) 
          (append 
           (deep-reverse (cdr lst)) 
           (list (deep-reverse (car lst))))) 
         (else 
          (append 
           (deep-reverse (cdr lst)) 
           (list (car lst)))))) 
好吧,我刚刚回答了类似于here的问题,但我并没有真正详细介绍深度逆转.

会发生什么事情是在将每个项目附加到列表末尾之前将其反转.想象一下如果它没有在列表的汽车上调用深度反转会发生什么:(反向'(a(b c d)e)是

(list
   'e
   '(b c d)
   'a
)

深度反转它看起来像

(list
    'e
    (deep-reverse '(b c d))
    'a
)

这是

(list
    'e
    '(d c b)
    'a
)

这是深度反转的另一个版本,以不同的方式编写,如果这样可以更清楚.

(define (deep-reverse ls)
  (define (deep-reverse-2 ls acc)
    (if (null? ls)
        acc
        (if (list? (car ls))
            (deep-reverse-2 (cdr ls) (cons (deep-reverse (car ls)) acc));  If adding  a list, reverse it first
            (deep-reverse-2 (cdr ls) (cons (car ls) acc)))))
  (deep-reverse-2 ls '()))

此版本的深拷贝使用累加器并且是尾递归的.

这会在将元素添加到列表之前检查该元素是否为列表,如果是,则首先将其反转.由于它调用自身来反转内部列表,因此它可以处理任意嵌套.

(deep-reverse '(a (b c d) e)) -> '(e (d c b) a)

尽管存在嵌套列表,但它是按反向字母顺序排列的.它评估如下:

(deep-reverse-2 '(a (b c d) e) '()); Which calls
(deep-reverse-2 '((b c d) e)  '(a)); which is the same as
(deep-reverse-2 '(e) (cons (deep-reverse-2 '(b c d) '()) '(a))); it calls deep-reverse on the list '(b c d) before consing it on.
(deep-reverse-2 '(e) (cons (deep-reverse-2 '(c d)  '(b)) '(a)))
(deep-reverse-2 '(e) (cons (deep-reverse-2 '(d)  '(c b)) '(a)))
(deep-reverse-2 '(e) (cons '(d c b) '(a)))
(deep-reverse-2 '(e)  '((d c b) a))
(deep-reverse-2 '() '(e (d c b) a))
'(e (d c b) a)
https://stackoverflow.com/questions/4102996/understanding-deep-reverse

转载注明原文:计划 – 了解深度逆转