SICP 問題 2.61(順序づけられた集合に対する adjoin-set を定義)
問題
順序づけられた表現を使った adjoin-set の実装を示せ。
element-of-set? の類推で、順序付けられない表現に比べ、約半分のステップ数を必要とする手続を作るのに、順序の利点をどう用いるか示せ。
解答
element-of-set? の類推でいいんだからこんな感じだよねぇ。
(define (adjoin-set x set) (cond ((null? set) (cons x '())) ((= x (car set)) (cons x set)) ;重複をゆるすとして x を追加する。 ((< x (car set)) (cons x set)) ;集合の先頭より小さかったら x を先頭に付加した集合を返す。 (else ;x が 集合の先頭より大きかったらまだ先頭を除いた集合で再帰処理。 (cons (car set) (adjoin-set x (cdr set))))))
こんな感じか。
では実験。
よぉ〜し、おっけい。
gosh> (adjoin-set 4 '(1 2 3 4 5 6 7))
(1 2 3 4 4 5 6 7)
gosh> (adjoin-set 4 '())
(4)
gosh> (adjoin-set 4 '(5 6 7))
(4 5 6 7)
gosh> (adjoin-set 4 '(1 2 3))
(1 2 3 4)
gosh>