;2.56求导
(define (deriv exp var)
(cond ((number? exp) 0)
((variable? exp)
(if (same-variable? exp var) 1 0))
((sum? exp)
(make-sum (deriv (addend exp) var)
(deriv (augend exp) var)))
((product? exp)
(make-sum
(make-product (multiplier exp)
(deriv (multiplicand exp) var))
(make-product (deriv (multiplier exp) var)
(multiplicand exp))))
((exponentiation? exp)
(make-product (exponent exp)
(make-product (make-exponentiation (base exp)
(- (exponent exp) 1))
(deriv (base exp) var))))
(else
(display "unknown expression type --DERIV" ))))
;variable?
(define (variable? x) (symbol? x))
;same-variable?
(define (same-variable? x y) (and (symbol? x) (symbol? y) (eq? x y)))
;make-sum
(define (make-sum x y)
(cond ((= 0 x) y)
((= 0 y) x)
((and (number? x) (number? y)) (+ x y))
(else (cons x (cons '+ y)))))
;make-product
(define (make-product x y)
(cond ((or (= 0 x) (= 0 y)) 0)
((= 1 x) y)
((= 1 y) x)
((and (number? x) (number? y)) (* x y))
(else (cons x (cons '* y)))))
;=number?
(define (=number? x y) (and (number? x) (number? y) (= x y)))
;sum?
(define (sum? x)
(and (pair? x) (eq? (cadr x) '+)))
;addend 被加数 表示和式的第二个参数
(define (addend s) (car s))
;augend 加数 表示和式的第三个参数
(define (augend s)
(if (null? (cdddr s))
(caddr s)
(cons '+ (cddr s))))
;product?
(define (product? x)
(and (pair? x) (eq? (cadr x) '*)))
;multiplier 被乘数是乘式第二个参数
(define (multiplier p) (car p))
;multiplicand 乘数是乘式里面的第三个参数
(define (multiplicand p)
(if (null? (cdddr p))
(caddr p)
(cons '* (cddr p))))
;exponentiation?
(define (exponentiation? x)
(and (pair? x) (eq? (car x) '**)))
;make-exponentiation
(define (make-exponentiation base exponet)
(cond ((=number? exponet 0) 1)
((=number? exponet 1) base)
((=number? base 0) 0)
((=number? base 1) 1)
(else (list '** base exponet))))
;base?
(define (base x)
(cadr x))
;exponet?
(define (exponent x)
(caddr x))
2.58
最新推荐文章于 2022-04-20 21:08:54 发布