SICP 読み (79) 2.5.3 例: 記号代数
濃い多項式に適しているという項リストの表現。
問題 2.89
まず、0 が空リストでない、という事を忘れないように。あと、なるべく term-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))
できれば、手続きの名前はそのままで、が理想。アマいか。うーん ...
駄目か。add-terms とか mul-terms というレベルから変更が必要っぽい。大体 term という概念自体が不要に見えるし。
でもトップダウンで話が進んでるとゆー事は、デキるってコトなんでしょうかね。逆に言えば、add-terms とか mul-terms から term とか term-list を検討した方が良いのか。
(define (add-terms L1 L2) (cond ((empty-termlist? L1) L2) ((empty-termlist? L2) L1) (else (let ((t1 (first-term L1)) (t2 (first-term L2))) (cond ((> (order t1) (order t2)) (adjoin-term t1 (add-terms (rest-terms L1) L2))) ((< (order t1) (order t2)) (adjoin-term t2 (add-terms L1 (rest-terms L2)))) (else (adjoin-term (make-term (order t1) (add (coeff t1) (coeff t2))) (add-terms (rest-terms L1) (rest-terms L2)))))))))
上記で言えば empty-termlist? は 0 なリストだったら、という意味だな。あるいは first-term は order と coeff なリストを返す手続き? もう少しツッコンで書いとくと、リストの length - 1 と car を返す、という事か。
rest-terms は同じで良さげ。order も coeff もか。
make-term は二番目の引数をそのまま返せば良いように見える。検討が必要なのは adjoin-term ですな。って単純に cons したら良さげなんですが、末端がどーなるかが微妙に見えてない。
あ、empty-termlist? はもらったリストが '() だったら、なソレも必要だな。そーゆー意味では the-empty-termlist は '() でも良いのか?
# =zero? も変更必要かも
かけ算な実装をチェックするに上記のソレで動きそうな気がする。
がしかし、確認は別途で。(を