問題2.94 – SICP(計算機プログラムの構造と解釈)その103
2009年02月17日
問題2.94
多項式の算術演算パッケージに最大公約数を求める手続きを追加する。
(define (install-polynomial-package) ... (define (gcd-terms a b) (if (empty-termlist? b) a (gcd-terms b (remainder-terms a b)))) (define (remainder-terms a b) (cadr (div-terms a b))) (define (gcd-poly p1 p2) (if (same-variable? (variable p1) (variable p2)) (make-poly (variable p1) (gcd-terms (term-list p1) (term-list p2))) (error "Polys not in same var -- GCD-POLY" (list p1 p2)))) ... (put 'greatest-common-divisor '(polynomial polynomial) (lambda (p1 p2) (tag (gcd-poly p1 p2)))) ... 'done)
整数の算術演算パッケージにに最大公約数を求める手続きを追加する。
(define (install-integer-package) ... (define (gcd a b) (if (= b 0) a (gcd b (remainder a b)))) ... (put 'greatest-common-divisor '(integer integer) gcd) ... 'done)
汎用演算として greatest-common-divisor
手続きを追加する。
(define (greatest-common-divisor a b) (apply-generic 'greatest-common-divisor a b))
実行結果
(define p1 (make-polynomial 'x '((4 1) (3 -1) (2 -2) (1 2)))) ;; x^4 - x^3 - 2x^2 + 2x ;(polynomial x (4 1) (3 -1) (2 -2) (1 2)) (define p2 (make-polynomial 'x '((3 1) (1 -1)))) ;; x^3 - x ;(polynomial x (3 1) (1 -1)) (greatest-common-divisor p1 p2) gosh> (polynomial x (2 -1) (1 1))
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542