2014-12-07 118 views
0

我有一系列表达式从后缀转换为前缀,我认为我会尝试编写一个程序在DrRacket中为我做。我遇到了一些更复杂的问题,例如(10 (1 2 3 +) ^)球拍后缀为前缀

我有非常简单的情况下(1 2 \*)(\* 1 2)。我已经将这些表达式设置为一个列表,并且我知道您必须使用cdr/car和递归来完成它,但那是我卡住的地方。

我的输入将是沿着'(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)))])) 

显然我收到绊倒了,因为大多数时候(cdr lst)会返回一对。我猜我的else语句的结构是错误的,我需要它是cons而不是list,但我不确定如何在这种情况下正常工作。

+0

表达式是否以列表的形式到达列表元素是:((“,”,“2”,“*”,“)”)? – MondKin 2014-12-07 18:44:02

回答

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