計算機程序的構造和解釋 練習題2.95

先利用2.94練習的程序,定義p1 p2 p3,然後計算q1 q2,最後求出最大公約多項式。

(define p1 (make-polynomial 'x (make-sparse-terms '((2 1) (1 -2) (0 1)))))
(define p2 (make-polynomial 'x (make-sparse-terms '((2 11) (0 7)))))
(define p3 (make-polynomial 'x (make-sparse-terms '((1 13) (0 5)))))
(define q1 (mul p1 p2))
(define q2 (mul p1 p3))
(mul p1 p2)
(mul p1 p3)
(greatest-common-div-divisor q1 q2)

運算結果像題目說的結果並不是p1,而是帶有分數的結果。

'done
'done
'done
'done
'(polynomial x sparse (4 11) (3 -22) (2 18) (1 -14) (0 7))
'(polynomial x sparse (3 13) (2 -21) (1 3) (0 5))
'(polynomial x sparse (2 8 106/169) (1 -17 43/169) (0 8 106/169))

看下最終的結果,如果給每個係數都除以8又106/169,得到剛好是我們的p1,在最大公約多項式的時候出現了有理數,這顯然不是我們希望的。接着我們跟蹤gcd-terms,查看具體的運算結果。

  (define (div-terms L1 L2)
    (if (empty-termlist? L1)
        (list (the-empty-termlist) (the-empty-termlist))
        (let ((t1 (first-term L1))
              (t2 (first-term L2)))
          (if (> (order t2) (order t1))
              (list (the-empty-termlist) L1)
              (let ((new-c (div (coeff t1) (coeff t2)))
                    (new-o (- (order t1) (order t2))))
                (if (=zero? new-c)
                     (list (the-empty-termlist) L1)
                     (let ((rest-of-result (div-terms (sub-terms L1 (mul-term-by-all-terms (make-term new-o new-c) L2)) L2)))
                       (list (adjoin-term (make-term new-o new-c) (car rest-of-result)) (cadr rest-of-result))
                       )))))))

跟蹤程序發現,其實產生分數的原因是得到商(new-c (div (coeff t1) (coeff t2))的新系數的時候,使用了div的通用表達式,兩個整數使用div,就會得到一個有理數結果,這導致結果中存在有理數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章