2013-02-25 4 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)))))) 

하지만 그냥 뒤쪽으로 ((1 2) (3 4)) 던졌습니다. 무엇이 잘못되었으며 어떻게 작동합니까?

+0

무슨 대답을 원하십니까? '(1 (2 3) 4)와'(1 (2 (3 4)))의 깊은 반대는 무엇입니까? – GoZoner

+0

역행 된리스트'((4 3) (2 1))'내 역순으로 목록을 역순으로 호출해야합니다. – zanegray

답변

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), 사람들에게 더 이상 사용하도록 요청해서는 안됩니다. –

+0

알 수 있습니다. 제거하도록 수정되었습니다. – GoZoner

+0

하지만 목록의 단일 레벨 목록에서만 작동합니다. 맞습니까? – zanegray

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)) 
관련 문제