;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
(error "unknown expression type --DERIV" exp))))
;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 . w)
(define (iter s)
(cond ((null? s) '())
((=number? 0 (car s)) (iter (cdr s)))
(else (cons (car s) (iter (cdr s))))))
(if (null? (cdr (iter w)))
(car (iter w))
(cons '+ (iter w))))
;make-product
(define (is-in x s)
(if (null? s)
#f
(or (eq? x (car s))
(is-in x (cdr s)))))
(define (make-product . w)
(define (iter s)
(cond ((null? s) '())
((=number? 1 (car s)) (iter (cdr s)))
(else (cons (car s) (iter (cdr s))))))
(if(is-in 0 (iter w))
0
(if (null? (cdr (iter w)))
(car (iter w))
(cons '* (iter w)))))
;=number?
(define (=number? x y) (and (number? x) (number? y) (= x y)))
;sum?
(define (sum? x)
(and (pair? x) (eq? (car x) '+)))
;addend 被加数 表示和式的第二个参数
(define (addend s) (cadr s))
;augend 加数 表示和式的第三个参数
(define (augend s)
(if (null? (cdddr s))
(caddr s)
(cons '+ (cddr s))))
;product?
(define (product? x)
(and (pair? x) (eq? (car x) '*)))
;multiplier 被乘数是乘式第二个参数
(define (multiplier p) (cadr 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.56
最新推荐文章于 2024-06-07 14:34:14 发布