0

我试图让一个方案导数计算器更能接受输入,从求和过程开始,最终是乘积。我一直在尝试修改程序以接受形式的输入,(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 似乎真的不适合 if 语句,但是我的老师给了我假设它的外观结构,所以它让我感到困惑,它不起作用,或者假设我想工作。

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

到目前为止,我对 Scheme 并不感兴趣,虽然知道或理解它似乎很酷,但我的老师在过去 2 周内试图适应它,但我无法掌握它。

4

1 回答 1

0

因此,在您的情况下,您有带有 3 个参数的 if 子句,而它需要 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) ...)。例如,你可以有这样的 make-sum 函数:

(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)),猜猜这就是你所期望的。

顺便说一句,你在 scp 中没有那个程序吗?如果没有,你一定要试试,这是一本学习 sheme 和一般编程的好书。http://mitpress.mit.edu/sicp/

于 2012-12-15T17:46:31.630 回答