计划的深度逆转

时间:2013-02-25 00:40:20

标签: scheme racket

当输入((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))。出了什么问题,如何让它发挥作用?

3 个答案:

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