2.5.3实例:符号代数
在本次实例中只考虑实现多项式的加法与乘法功能,同时未定元(自变量)也只有一个。
在书中,这一次实例还有其他部分,比如嵌入安装包等。但我在书上没有找到如何构造出操作表格,放入,取出的操作,只是假定它可以实现。我也不清楚这一种数据结构如何实现,所以跳过了这一部分,只完成了多项式加法与乘法的功能。
;;前置要求:仅考虑加法和乘法,有相同未定元,项表按增序排列
;;多项式算术
;;首先假定多项式为poly,有选择函数variable,term-list提取出变量与系数-指数表
;;实现加法运算
(define (add-poly p1 p2)
(if (same-variable? p1 p2)
(make-poly (variable p1)
(add-terms (term-list p1)
(term-list p2)))
(error "poly not in same var"
(list p1 p2))))
;;实现乘法运算
(define (mul-poly p1 p2)
(if (same-variable? p1 p2)
(make-poly (variable p1)
(mul-terms (term-list p1)
(term-list p2)))
(error "poly not in same var"
(list p1 p2))))
;;如何把两个系数-指数表相加
(define (add-terms p1 p2)
(cond ((empty-list? p1) p2)
((empty-list? p2) p1)
(else
(let ((t1 (first-term p1)) (t2 (first-term p2)))
(cond ((> (order p1) (order t2))
(adjoin-term
t1
(add-terms (rest-terms p1) p2)))
((< (order p1) (order p2))
(adjoin-term
t2
(add-terms p1 (rest-terms p2))))
(else
(adjoin-term
(make-term (order t1)
(add (coeff t1) (coeff t2)))
(add-terms (rest-terms p1)
(rest-terms p2)))))))))
;;如何把两个系数-指数表相加
(define (mul-terms p1 p2)
(if (empty-termlist? p1)
(the-empty-termlist)
(add-terms (mul-term-by-all-terms (first p1) p2)
(mul-terms (rest-terms p1) p2))))
;;如何用一个项乘以参数表
(define (mul-term-by-all-terms term list)
(if (empty-termlist? list)
(the-empty-termlist)
(let ((t2 (first-term list)))
(adjoin-term (make-term (+ (order term) (order t2))
(mul (coeff term) (coeff t2)))
(mul-term-by-all-terms term (rest-terms list))))))
;;如何把一个项加入到项表里
(define (adjoin-term term term-list)
(if (=zero? (coeff term))
(term-list)
(cons term term-list)))
;;做完以上部分,我们就已经实现完了‘操作’。接下来要实现其内部的实现,包括多项式与项表的实现
;;定义一个空表
(define (the-empty-termlist)
'()
)
;;取出项表里的第一个项
(define (first-term term-list)
(car term-list))
取出项表里的其余项
(define (rest-terms term-list)
(cdr term-list))
;;判断是否是空表
(define (empty-termlist? term-list)
(null? term-list))
;;构造出一个项
(define (make-term order coeff)
(list order coeff))
;;取出项里的指数
(define (order term)
(car term))
;;取出项里的系数
(define (coeff term)
(cadr term))
;;构造出一个多项式
(define (make-poly var termlist)
(cons var termlist))
;;判断两个多项式是否同变量
(define (same-variable? p1 p2)
(eq? (car p1) (car p2)))
;;取出多项式的变量
(define (variable poly)
(car poly))
;;取出多项式的项表
(define (term-list poly)
(cadr poly))
;;判断多项式是否为空
(define (empty-list? poly)
(null? poly))
;;将两个数相加
(define (add arg1 arg2)
(+ arg1 arg2))
;;取出项表的第一个数
(define (first termlist)
(car termlist))
;;将参数相乘
(define (mul arg1 arg2)
(* (arg1) (arg2)))
;;判断参数是否为0
(define (=zero? arg)
(= 0 arg))
书上说采用通用型的加法过程add和mul会很有好处。但我并不是很了解这一点。可能是因为这个程序还是太简单了把。第一点就是把这个过程封装了起来,更加直观(感觉也没有),第二点个人感觉可能是方便以后对程序做拓展,引入分数,复数等的时候更好修改。但在这个程序里我确实没觉得有什么好处。
另外,我个人认为这一章的核心是通用型系统,系统的层次性结构。但是书中这一方面的基础:构造出一个操作表格,打上标签,推入表格,取出内容的操作却都是在“假定已有”的基础上进行的。我不知道如何完整编写这个实例,感觉和前面的一个实例:图形语言一样,写不出可编译程序。
蓝瘦香菇。
2.5.3实例:符号代数
https://zzhygs.cn/index.php/archives/41/