2013-02-25 53 views
0

當輸入((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)))))) 

,但它只是拋出回((12)(34))。什麼是錯的,我如何得到這個工作?

+0

你想要什麼答案做?什麼是'(1(2 3)4)和'(1(2(3 4)))的深逆? – GoZoner 2013-02-25 00:41:39

+0

我可以看到一種可能性:在反向列表'(((4 3)(2 1))'內反轉列表,在這種情況下,您只需進行遞歸調用即可反向列表 – zanegray 2013-02-25 00:46:51

回答

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

作業標記爲[已棄用](http: //meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated),你不應該讓人們使用它 – 2013-02-25 00:46:43

+0

明白了;編輯刪除。 – GoZoner 2013-02-25 00:48:20

+0

但這隻適用於列表中單個級別的列表,對嗎? – zanegray 2013-02-25 00:49:52

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