博主头像
zzh

ワクワク

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/
本文作者 zzh
发布时间 2024-09-19
许可协议 CC BY-NC-SA 4.0
发表新评论