改进Scheme中的衍生实例

时间:2012-12-01 05:20:59

标签: scheme racket r5rs

我正在尝试使方案衍生产品计算器更接受输入,从总和程序开始,最终产品。我一直在尝试修改程序,以(deriv '(* x y (+ x 3)) 'x)而不是(deriv '(* x (* y (+ x 3))) 'x)的形式接受输入。

我正在处理的代码是:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SUM RELATED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;makes a sum structure
(define (make-sum a1 a2)
    (list '+ a1 a2))


;checks if something is a sum structure
(define (sum? x)
(and (pair? x) 
   (eq? (car x) '+)))

;get first term of sum
(define (addend s) 
(cadr s))

;get second term of sum
(define (augend s)
(caddr s))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PRODUCT RELATED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;make a product structure
(define (make-product m1 m2) 
(list '* m1 m2))

;checks if something is a product structure
(define (product? x)
(and (pair? x) 
   (eq? (car x) '*)))

;get first factor of product
(define (multiplier p) 
(cadr p))

;get second factor of product
(define (multiplicand p) 
(caddr p))

我试图解决这个问题,但到目前为止没有太多运气,这是我试图在几个不同的变体中实现的:

;makes a sum structure
(define (make-sum a1 a2)
(if (sum? a1)
  (if (sum? a2)
      (cons '+ (append (cdr a1) (cdr a2)))
      (cons '+ (append (cdr a1) (list a2)))
      (cons '+ (append (list a1) (cdr a2)))))
    (list '+ a1 a2))

它给了我一个错误的语法调用。而且我可以看到我的第二个如果真的似乎不适合if语句,但我的老师给了我看起来如何看的结构,所以它让我困惑它不起作用,或者假设工作,我想。

如果有人能帮助我理解这一点,那就太好了。

到目前为止,我并不热衷于计划,虽然看起来很难知道或理解,但我的老师正试图在过去两周内适应它,我无法掌握它。

1 个答案:

答案 0 :(得分:0)

所以,在你的情况下,你有if子句有3个参数,而它需要2,所以你得到一个错误。如果您想修复您的版本,您应使用此类版本

(define (make-sum a1 a2)
(if (sum? a1)
  (if (sum? a2)
      (cons '+ (append (cdr a1) (cdr a2)))
      (cons '+ (append (cdr a1) (list a2))))
  (if (sum? a2)
      (cons '+ (append (list a1) (cdr a2)))
      (list '+ a1 a2))))

或者,如果你想要更多通用代码,你肯定会使用函数,使用可变数量的参数 - 使用语法(define (func-name . list-of-arguments) ...)。例如,您可以使用此类生成函数:

(define (make-sum . args)
  (cons '+ (apply append (map (lambda (x) (if (sum? x) (cdr x) (list x))) args))))

因此,(make-sum 'a '(+ a b) 'b '(* a b))将返回'(+ a a b b (* a b)),猜测这就是您的预期。

顺便问一下,你没有在sicp那个程序吗?如果不是,你肯定会尝试它,这是一本学习sheme和编程的好书。 http://mitpress.mit.edu/sicp/

相关问题