sicp ex-2.57 多项式求导

Posted plumnut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sicp ex-2.57 多项式求导相关的知识,希望对你有一定的参考价值。

原书正文中列举了怎样对二项式求导的方法,本习题要求修改求导函数支持以支持多项式求导。
主要修改在于取 +/* 运算的第二个运算数:如果剩余的运算数大于1,则返回一个列表,并且在列表前加 +/* 运算符。

 

这道题在网上查了很久,没找到满意的答案,自己动手写一个,功能验证正确。

测试用例:

(derive ‘(+ y x) ‘x)
(derive ‘(+ y x 3) ‘x)
(derive ‘(+ y x (+ x 4) 3) ‘x)
(derive ‘(+ (* x x) (* 3 x) y) ‘x)
(derive ‘(+ (* x x) (* 3 x)) ‘x)
(derive ‘(+ (* x x x (+ 1 (* x x))) (* 3 x)) ‘x)

运行结果:

1
1
2
‘(+ (+ x x) 3)
‘(+ (+ x x) 3)
‘(+ (+ (* x (+ (* x (+ (* x (+ x x)) (+ 1 (* x x)))) (* x (+ 1 (* x x)))))  * x x (+ 1 (* x x)))) 3)

代码如下:

(define (derive exp var)
  (define (=number? a b)
    (and (number? a) (= a b)))
  
  (define (make-sum a b)
    (cond ((=number? a 0) b)
          ((=number? b 0) a)
          ((and (number? a) (number? b)) (+ a b))
          (else (list + a b))))
  
  (define (make-product a b)
    (cond ((=number? a 0) 0)
          ((=number? b 0) 0)
          ((=number? a 1) b)
          ((=number? b 1) a)
          ((and (number? a) (number? b)) (* a b))
          (else (list * a b))))
  
  (define (product? a)
    (if (eq? a *)
        true
        false))
  
  (define (sum? a)
    (if (eq? (car a) +)
        true
        false))
  
  (define (addend s) (cadr s))
  
  (define (make-sum-list a b)
    (if (= (length b) 1)
        (list + a (car b))
        (append (list + a ) b))
    )
  (define (augend s)
    (if (<= (length s) 3)
        (caddr s)
        (make-sum-list (caddr s) (cdddr s))))

  
  (define (make-product-list a b)
    (if (= (length b) 1)
        (list * a (car b))
        (append (list * a ) b))
    )
  
  (define (multiplier s) (cadr s))
  
  (define (multiplicand s) 
    (if (<= (length s) 3)
        (caddr s)
        (make-product-list (caddr s) (cdddr s))))
  
  (define (variable? a)
    (symbol? a))
  
  (cond ((number? exp) 0)
    ((variable? exp)
     (if (eq? exp var) 1 0))
    ((sum? exp) (make-sum (derive (addend exp) var) (derive (augend exp) var)))
    ((product? (car exp)) (make-sum (make-product (multiplier exp) (derive (multiplicand exp) var))
                       (make-product (derive (multiplier exp) var) (multiplicand exp))))))

 












以上是关于sicp ex-2.57 多项式求导的主要内容,如果未能解决你的问题,请参考以下文章

PTA 乙级 1010 一元多项式求导 (25分)

Julia元编程初探——以简单符号求导为例

7-16 一元多项式求导

1010 一元多项式求导

1010. 一元多项式求导 (25)

PAT 1010. 一元多项式求导