列表反转与深度反转

列表反转的意思是将一个列表逆序过来,比如(list 1 2 3) -> (list 3 2 1)

实现的时候最直接的想法是先将除了第一个元素意外的子表反转,然后将第一个元素接到后面去,但是在scheme中没有提供将一个元素append到某个list的结尾。

因此使用头插入的办法,遍历要反转的表的第一个元素,用cons操作插入到结果的表的头部。

(define (reverse-list ll)
  (define (reverse-list-iter r remain)
    (if (null? remain)
      r
      (reverse-list-iter (cons (car remain) r) (cdr remain))))
  (reverse-list-iter () ll))
深度反转是表中每个元素的子表也要反转过来,比如(list (list 1 2) (list 3 4) 5) -> (list 5 (list 4 3) (list 2 1))实现的思路跟反转差不多,多了一个判断,当表的第一个元素是本身也是表的话递归进去反转之
(define (deep-reverse-list ll)
  (define (deep-reverse-list-iter r remain)
    (cond ((null? remain) r)
          ((not (pair? (car remain)))
           (deep-reverse-list-iter (cons (car remain) r) (cdr remain)))
          (else (deep-reverse-list-iter (cons (deep-reverse-list-iter () (car remain)) r) (cdr remain)))))
  (deep-reverse-list-iter () ll))

原文地址:https://www.cnblogs.com/mathlover/p/2685938.html