SICP Section 2.3.2

本节内容中用的程序代码如下:

(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)))) (else (error "unkown expression type -- DERIV" exp))));(define (variable? x) (symbol? x))(define (same-variable? x y) (and (variable? x) (variable? y) (eq? x y)));;sum(define (make-sum a1 a2) (list '+ a1 a2))(define (make-sum a1 a2) (cond ((=number? a1 0) a2) ((=number? a2 0) a1) ((and (number? a1) (number? a2)) (+ a1 a2)) (else (list '+ a1 a2))))(define (=number? x y) (and (number? x) (number? y) (= x y)))(define (sum? exp) (and (pair? exp) (eq? '+ (car exp))))(define (addend s) (cadr s))(define (augend s) (caddr s));;product(define (make-product m1 m2) (list '* m1 m2))(define (make-product m1 m2) (cond ((or (=number? m1 0) (=number? m2 0)) 0) ((=number? m1 1) m2) ((=number? m2 1) m1) ((and (number? m1) (number? m2)) (* m1 m2)) (else (list '* m1 m2))))(define (product? exp) (and (pair? exp) (eq? '* (car exp))))(define (multiplier p) (cadr p))(define (multiplicand p) (caddr p));;test(display (deriv '(+ x 3) 'x))(newline)(display (deriv '(* x y) 'x))(newline)(display (deriv '(* (* x y) (+ x 3)) 'x))(newline) 

练习2.56

这道题要求添加对指数函数的求导,而且指数是整数。像题目中描述的一样我们只需要改两个地方:

第一,给deriv函数添加一个新的子句,如下所示:

(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 (make-product (exponent exp) (make-exponentiation (base exp) (- (exponent exp) 1))) (deriv (base exp) var))) (else (error "unkown expression type -- DERIV" exp)))) 

第二,相应地,需要给出指数的构造函数和选择函数,在下面的程序中用符号“**”表示乘幂:

(define (make-exponentiation b e) (cond ((=number? e 0) 1) ((=number? e 1) b) (else (list '** b e))))(define (exponentiation? exp) (and (pair? exp) (eq? '** (car exp))))(define (base e) (cadr e))(define (exponent e) (caddr e)) 

练习2.57

按照书上的想法,让一个和式的addend是它的第一项,而其augend是和式中的其余项。例如,和式为(+ x y z),则其addend为x,augend为(+ y z)。所以只需要改加法的augend函数,以及乘法的multipicand函数:

(define (augend s) (if (null? (cdddr s)) (caddr s) (cons '+ (cddr s))));(define (multiplicand p) (if (null? (cdddr p)) (caddr p) (cons '* (cddr p)))) 

练习2.58

a)这一问比较简单直接把前缀表达式改为中缀表达式即可:

;加法(define (make-sum a1 a2) (list a1 '+ a2))(define (make-sum a1 a2) (cond ((=number? a1 0) a2) ((=number? a2 0) a1) ((and (number? a1) (number? a2)) (+ a1 a2)) (else (list a1 '+ a2))))(define (sum? exp) (and (pair? exp) (eq? '+ (cadr exp))))(define (addend s) (car s))(define (augend s) (caddr s));;乘法(define (make-product m1 m2) (list m1 '* m2))(define (make-product m1 m2) (cond ((or (=number? m1 0) (=number? m2 0)) 0) ((=number? m1 1) m2) ((=number? m2 1) m1) ((and (number? m1) (number? m2)) (* m1 m2)) (else (list m1 '* m2))))(define (product? exp) (and (pair? exp) (eq? '* (cadr exp))))(define (multiplier p) (car p))(define (multiplicand p) (caddr p))


你可能感兴趣的:(list,newline)