球拍后缀为前缀

时间:2014-12-07 18:40:08

标签: racket postfix-mta prefix

我有一系列的表达式可以从postfix转换为前缀,我想我会尝试编写一个程序来为我在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,但我不确定如何让它在这里正常工作情况下。

2 个答案:

答案 0 :(得分:1)

您是否在想这样的事情?

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

答案 1 :(得分:0)

尝试这样的事情:

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

这通过使用map在每个调用的参数上调用自身来递归地对结构进行操作。