;2.59 union-set
;element-of-set?
(define (element-of-set? x set)
(cond ((null? set) #f)
((equal? x (car set)) #t)
(else (element-of-set? x (cdr set)))))
(define (union-set s1 s2)
(cond ((null? s1) s2)
((null? s2) s1)
((element-of-set? (car s1) s2)
(union-set (cdr s1) s2))
(else (cons (car s1) (union-set (cdr s1) s2)))))
;2.61
;just a insertion sorting
(define (adjoin-set x tset)
(define (iter set s)
(cond ((null? s) (cons x s))
((< x (car s)) (if (null? set)
(cons x s)
(append set (cons x s))))
((= x (car s)) tset)
(else (iter (if (null? set)
(list (car s))
(append set (list (car s))))
(cdr s)))))
(iter '() tset))
;2.62 sorted-union-set
(define (sorted-union-set s1 s2)
(cond ((null? s1) s2)
((null? s2) s1)
((< (car s1) (car s2)) (cons (car s1) (sorted-union-set (cdr s1) s2)))
((= (car s1) (car s2)) (sorted-union-set (cdr s1) s2))
(else (cons (car s2) (sorted-union-set s1 (cdr s2))))))
;2.63 The result is same and the second is slower
;define tree
(define (entry tree) (car tree))
(define (left-branch tree) (cadr tree))
(define (right-branch tree) (caddr tree))
(define (make-tree entry left right)
(list entry left right))
(define (tree->list-1 tree)
(if (null? tree)
'()
(append (tree->list-1 (left-branch tree))
(cons (entry tree)
(tree->list-1 (right-branch tree))))))
(define (tree->list-2 tree)
(define (copy-to-list tree result-list)
(if (null? tree)
result-list
(copy-to-list (left-branch tree)
(cons (entry tree)
(copy-to-list (right-branch tree)
result-list)))))
(copy-to-list tree '()))
;2.64
(define (list->tree elements)
(car (partial-tree elements (length elements))))
(define (partial-tree elts n)
(if (= n 0)
(cons '() elts)
(let ((left-size (quotient (- n 1) 2)))
(let ((left-result (partial-tree elts left-size)))
(let ((left-tree (car left-result))
(non-left-elts (cdr left-result))
(right-size (- n (+ left-size 1))))
(let ((this-entry (car non-left-elts))
(right-result (partial-tree (cdr non-left-elts)
right-size)))
(let ((right-tree (car right-result))
(remaining-elts (cdr right-result)))
(cons (make-tree this-entry left-tree right-tree)
remaining-elts))))))))
;2.65
(define (union-set-1 s1 s2)
(list->tree (sorted-union-set (tree->list-1 s1) (tree->list-2 s2))))
(define (intersection-set-1 s1 s2)
(list->tree (intersection-set (tree->list-1 s1) (tree->list-2 s2))))
;2.66
(define (look-up-from-tree given-key tree)
(cond ((null? tree) #f)
((equal? (entry tree) given-key) (entry tree))
((> given-key (entry tree)) (look-up-from-tree given-key (right-branch tree)))
(else (look-up-from-tree given-key (left-branch tree)))))
2.59-2.66
最新推荐文章于 2024-06-26 13:47:56 发布