Add implementation of dense representation of polynomials (2.90)

This commit is contained in:
Oliver Payne 2022-03-15 20:32:32 +00:00
parent 27bb0bc3ee
commit 327bac9c7d
1 changed files with 38 additions and 2 deletions

View File

@ -681,7 +681,43 @@
;; It isn't possible to coerce from one to the other, so a mixed-type operator is needed, and this
;; approach would fail.
(define (highest-order-term term-list)
(length term-list))
(define (make-term order coeff) (list order coeff))
(define (order term) (car term))
(define (coeff term) (cadr term))
(define first-term car)
(define (rest-terms term-list)
(if (pair? term-list)
(cdr term-list)
the-empty-termlist))
(define (make-termlist coeffs)
(cond ((null? coeffs) '())
((= 0 (car coeffs))
(make-termlist (cdr coeffs)))
(else (cons (car coeffs)
(make-termlist (cdr coeffs))))))
(define the-empty-termlist '())
(define empty-termlist? null?)
(define (adjoin-term-dense term term-list)
(let ((term-list-order (highest-order-term term-list)))
(cond ((and (= (order term) 1)
(= term-list-order 0))
(make-termlist (list (coeff term))))
((= (order term) term-list-order)
(make-termlist
(cons (add (coeff term)
(first-term term-list))
(rest-terms term-list))))
((> (order term) term-list-order)
(make-termlist
(cons (coeff term)
(adjoin-term-dense
(make-term (- (order term) 1) 0)
term-list))))
(else (adjoin-term-dense term (rest-terms term-list))))))