0

输入((1 2) (3 4))的列表时,我想反转它,但不是这样的((3 4) (1 2)),这就是reverse所做的,所以我试图写深度逆过程:

(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))。出了什么问题,我该如何让它工作?

4

3 回答 3

4

尝试:

(define (deep-reverse l) (map reverse l))

以上是最简单的答案;真正的答案取决于您期望 deep-reverse 做什么。请参阅我对您的问题的评论。

如果您想要一切,请一路向下:

(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)
于 2013-02-25T00:43:19.590 回答
1

一个好的开始是适用于列表的反向过程。然后修改它以递归地应用于列表中的每辆车:

(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))
于 2017-02-18T20:36:18.983 回答
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)))))))
于 2013-02-25T00:43:34.677 回答