2014-12-07 8 views
0

접미사 접미사로 변환 할 일련의 표현식이 있고 DrRacket에서 나를 위해이 프로그램을 작성하려고 할 것이라고 생각했습니다. (10 (1 2 3 +) ^)과 같이 복잡한 것 중 일부가 붙어 있습니다.접두사에 라켓 접미어

(1 2 \*)(\* 1 2)의 경우 매우 간단합니다. 이 표현식을 목록으로 설정했고 cdr/car 및 recursion을 사용하여이를 수행해야한다는 것을 알고 있습니다.하지만 그 부분이 내가 붙어있는 곳입니다.

입력 내용은 '(1 2 +)의 내용을 따릅니다.

나는 그런 '(1 2 +) 같은 간단한 것들을 가지고 더 복잡한 물건

(define ans '()) 
(define (post-pre lst) 
    (set! ans (list (last lst) (first lst) (second lst)))) 

나는이 (실패한가 제대로 작동하려면) 한 : 때문에

분명히
(define ans '()) 
(define (post-pre-comp lst) 
    (cond [(pair? (car lst)) (post-pre-comp (car lst))] 
     [(pair? (cdr lst)) (post-pre-comp (cdr lst))] 
     [else (set! ans (list (last lst) (first lst) (second lst)))])) 

I가 넘어지고 있어요 (cdr lst)는 대부분 한 쌍을 리턴합니다. 나는 else 구문의 구조가 잘못되었다고 추측하며 list 대신 cons이 필요하지만이 경우 제대로 작동하는 방법을 모르겠습니다.

+0

'(1, 2, "*", ")"목록 요소가'(1 2 *)'에 대해 목록으로 도착합니까? – MondKin

답변

0

는 다음과 같이하십시오.

1

이런 생각이 들었습니까? 재귀 적으로 호출 할 때마다의 인수에 자신을 호출하는 map를 사용하여

(define (postfix->prefix expr) 
    (cond 
    [(and (list? expr) (not (null? expr))) 
    (define op (last expr)) 
    (define args (drop-right expr 1)) 
    (cons op (map postfix->prefix args))] 
    [else expr])) 

이 구조에 작동합니다

(define (pp sxp) 
    (cond 
    ((null? sxp) sxp) 
    ((list? sxp) (let-values (((args op) (split-at-right sxp 1))) 
        (cons (car op) (map pp args)))) 
    (else sxp))) 

> (pp '(1 2 *)) 
'(* 1 2) 
> (pp '(10 (1 2 3 +) ^)) 
'(^ 10 (+ 1 2 3))