Dr Racket Scheme实现后缀表达式列表简化函数的问题求助
问题定位
- 运算符分支逻辑错误:计算得到的运算结果没有压回栈中继续参与后续运算,而是直接追加到了最终返回列表的头部。这就导致需要消费之前运算结果的后续运算符无法从栈中取到对应操作数,直接触发运行错误。你之前的第一个测试用例刚好是两个独立运算,每个运算结果都直接输出,所以碰巧得到了正确结果。
- 依赖未定义函数:
remove-last-two-values中使用的get-count函数你没有给出定义,如果本地没有实现该函数也会触发报错。
修复代码
核心逻辑修改(test函数)
把运算符分支的逻辑调整为标准逆波兰栈处理流程,计算结果压回栈中继续参与后续运算:
(define (test original) (let loop ((original original) (new '())) (cond ((null? original) (reverse new)) ; 反转栈得到和运算顺序一致的输出 ((memq (car original) '(+ - * /)) ; 直接匹配所有运算符,后续不用再改分支 (loop (cdr original) (cons (evaluate-expression (grab-last-two-values new) (car original)) (remove-last-two-values new)))) (else (loop (cdr original) (cons (car original) new))))))
补充缺失依赖
你可以直接用Racket内置的length函数替换remove-last-two-values里的get-count:
(define (remove-last-two-values ls) (cond ((= (length ls) 2) '()) (else (cons (car ls) (remove-last-two-values (cdr ls))))))
如果需要自己实现长度统计,补充get-count定义即可:
(define (get-count ls) (if (null? ls) 0 (+ 1 (get-count (cdr ls)))))
验证效果
- 输入
(9 7 / 8 7 /):返回(7/9 7/8),和原预期一致 - 输入
(9 7 / 8 7 / /):返回(9/8),也就是你要的1又1/8结果 - 加减乘后续直接在
evaluate-expression里加逻辑即可,不需要修改栈处理的核心代码
内容的提问来源于stack exchange,提问作者Wesley Brandt
相关产品推荐
相关产品推荐

