我有一系列的表达式可以从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
,但我不确定如何让它在这里正常工作情况下。
答案 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
在每个调用的参数上调用自身来递归地对结构进行操作。