1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| >>> def empty(s): return s is Link.empty >>> def set_contains(s, v): """Return True if and only if set s contains v.""" if empty(s): return False elif s.first == v: return True else: return set_contains(s.rest, v) >>> s = Link(4, Link(1, Link(5))) >>> set_contains(s, 2) False >>> set_contains(s, 5) True
>>> def adjoin_set(s, v): """Return a set containing all elements of s and element v.""" if set_contains(s, v): return s else: return Link(v, s) >>> t = adjoin_set(s, 2) >>> t Link(2, Link(4, Link(1, Link(5))))
>>> def intersect_set(set1, set2): """Return a set containing all elements common to set1 and set2.""" return keep_if_link(set1, lambda v: set_contains(set2, v)) >>> intersect_set(t, apply_to_all_link(s, square)) Link(4, Link(1))
>>> def union_set(set1, set2): """Return a set containing all elements either in set1 or set2.""" set1_not_set2 = keep_if_link(set1, lambda v: not set_contains(set2, v)) return extend_link(set1_not_set2, set2) >>> union_set(t, s) Link(2, Link(4, Link(1, Link(5))))
|