方案

时间:2015-12-04 10:13:49

标签: recursion scheme binary-tree racket

我正在使用带有列表缩写的初学者语言。 我一直在研究以下3天无济于事。

我需要编写一个名为step的函数来消耗a  方案表达式(ex)以AExp的形式生成一个AExp,代表ex的痕迹中的下一步

示例: 如果(ex)ex1是
 (+ 5(*(+ 1 2 3)2(* 4 1))7)

然后(步骤ex1)产生: (+ 5(* 6 2(* 4 1))7)。

到目前为止,这就是我所做的:

(define (step ex)
 (cond [(number? ex) (list  ex)]
       [else
     (cond
       [(symbol=? (ainode-op ex) '+)
          (cons(ainode-op ex)
                  (list-eval1 (ainode-args ex)))]
       [(symbol=? (ainode-op ex) '*)
          (cons(ainode-op ex)
                  (list-eval2 (ainode-args ex)))])]))

(define (list-eval1 exlist)
             (cond [(empty? exlist)(list 0)]
                   [else (append(step (first exlist))
                         (list-eval1 (rest exlist)))]))



      (define (list-eval2 exlist)
              (cond [(empty? exlist)(list 0)]
                    [else (append(step (first exlist))
                    (list-eval2 (rest exlist)))]))

但我的功能并不像我想要的那样工作。 有什么帮助吗?

1 个答案:

答案 0 :(得分:4)

这是一个提示。首先,您应该注意,当表达式只包含一个符号和一个或多个数字时,可以对其进行求值。因此,您可以定义一个辅助函数evaluable?,当其参数是可以计算的表达式时,它返回true。例如:

(define (evaluable? exp)
  (cond ((null? exp) #t)
        ((list? (car exp)) #f)
        (else (evaluable? (cdr exp)))))

然后,您可以定义step来评估可评估的第一个(子)表达式,并重建表达式的其余部分。在伪代码中,类似这样:

(define (step exp)
  (cond ((number? exp) exp)
        ((evaluable exp) (evaluate exp))
        (else (... make a recursive descent in the current expression by rebuilding the external expression...))))

当然evaluate应评估包含运算符和数字操作数的列表。

修改

如何下​​降和构建? step的最后一行可能是这样的:

(else (cons (car exp) (step-operands (cdr exp))))))

请注意,我们使用cons来重建具有相同car的结构,并使用函数step-operands处理操作数的结果,找到第一个操作数可以重写的表达式。由于这是作业,我将只给你一个这样的功能草图(请注意,我假设列表operands至少有一个元素,没有检查表达式的正确性):

(define (step-operands operands)
  (cond ((number? (car operands)) (cons (car operands) (... (cdr operands))))
        (else (cons (... (car operands))(cdr operands)))))

你只需要用适当的功能填充点(并考虑发生了什么!)