Skip to content

Commit 9081a32

Browse files
committed
增加练习2-87.
1 parent e463c62 commit 9081a32

File tree

2 files changed

+77
-4
lines changed

2 files changed

+77
-4
lines changed

chapter2/exercise2-87.rkt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#lang racket
2+
(require "poly.rkt")
3+
;;; 练习2-87
4+
(define (=zero-poly? poly)
5+
(define (all-coeff-zero? term-list)
6+
(if (empty-termlist? term-list)
7+
#t
8+
(and (=zero? (coeff (first-term term-list)))
9+
(all-coeff-zero? (rest-terms term-list)))))
10+
(all-coeff-zero? (term-list poly)))
11+

chapter2/poly.rkt

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66
(define (same-variable? v1 v2)
77
(and (variable? v1) (variable? v2) (eq? v1 v2)))
88

9+
(define (variable p) (car p))
10+
11+
(define (term-list p) (cdr p))
12+
913
(define (install-polynomial-package)
1014
;; internal procedures
1115

1216
;; representation of poly
1317
(define (make-poly variable term-list)
1418
(cons variable term-list))
1519

16-
(define (variable p) (car p))
17-
18-
(define (term-list p) (cdr p))
19-
2020
(define (add-poly p1 p2)
2121
(if (same-variable? (variable p1) (variable p2))
2222
(make-poly (variable p1)
@@ -41,3 +41,65 @@
4141
(put 'make 'polynomial (lambda (var terms) (tag (make-poly var terms))))
4242

4343
'done)
44+
45+
(define (empty-termlist? term-list)
46+
(null? term-list))
47+
48+
(define (first-term term-list)
49+
(car term-list))
50+
51+
(define (=zero? term)
52+
(or (empty-termlist? term)
53+
(= (coeff term) 0)))
54+
55+
(define (adjoin-term term term-list)
56+
(if (=zero? (coeff term))
57+
term-list
58+
(cons term term-list)))
59+
60+
(define (rest-terms term-list)
61+
(cdr term-list))
62+
63+
(define (make-term order coeff) (list order coeff))
64+
65+
(define (order term) (car term))
66+
67+
(define (coeff term) (cadr term))
68+
69+
(define (the-empty-termlist)
70+
'())
71+
72+
(define (add-terms L1 L2)
73+
(cond ((empty-termlist? L1) L2)
74+
((empty-termlist? L2) L1)
75+
(else
76+
(let ((t1 (first-term L1))
77+
(t2 (first-term L2)))
78+
(cond ((> (order t1) (order t2))
79+
(adjoin-term t1 (adjoin-term (rest-terms t1) t2)))
80+
((< (order t1) (order t2))
81+
(adjoin-term
82+
t2 (add-terms L1 (rest-terms L2))))
83+
(else
84+
(adjoin-term
85+
(make-term (order t1)
86+
(add (coeff t1) (coeff t2)))
87+
(add-terms (rest-terms L1)
88+
(rest-terms L2)))))))))
89+
90+
(define (mul-terms L1 L2)
91+
(if (empty-termlist? L1)
92+
(the-empty-termlist)
93+
(add-terms (mul-term-by-all-terms (first-term L1) L2)
94+
(mul-terms (rest-terms L1) L2))))
95+
96+
(define (mul-term-by-all-terms t1 L)
97+
(if (empty-termlist? L)
98+
(the-empty-termlist)
99+
(let ((t2 (first-term L)))
100+
(adjoin-term
101+
(make-term (+ (order t1) (order t2))
102+
(mul (coeff t1) (coeff t2)))
103+
(mul-term-by-all-terms t1 (rest-terms L))))))
104+
105+
(provide empty-termlist? =zero? first-term rest-terms coeff term-list)

0 commit comments

Comments
 (0)