Exercise 2.61
Give an implementation of adjoin-set using the ordered representation. By analogy with element-of-set? show how to take advantage of the ordering to produce a procedure that requires
on the average about half as many steps as with the unordered representation.
這道題實現起來倒是不難,每次比較一下集合第一個元素和要插入的元素的大小,如果要插入的數小於等於集合第一個元素,就直接用 cons 把這個新元素和集合連線起來; 如果要插入的元素大於集合第一個元素,
就把集合第一個元素和要插入元素和集合其他項連線的結果連線起來就行了。最差的情況就是,要插入的元素比集合最大的元素還要大,這樣要遍歷整個集合,此時和原來的實現沒有區別; 在其他情況,平均應該可以節省一半的步驟。
(define (adjoin-set x set)
(let ((first (car set)))
(cond ((null? set) (list x))
((<= x first) (cons x set))
(else (cons first (adjoin-set x (cdr set)))))))
(define set1 (list 1 3 5 7 9))
(adjoin-set 6 set1)
; 執行結果
'(1 3 5 6 7 9)