t s t r
play

ts tr - PDF document

ts tr tr rs Prt r Ps tr rtr


  1. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸ Example I: Dates Abstract level: names for dates over a certain range Concrete level: typically 6 characters: YYMMDD Date crises caused by INADEQUATE internal formats: Slide 102 • Digital’s PDP-10 : using 12-bit dates (good for at most 11 years) • 2000 crisis : 48 bits could be good for lifetime of universe! Lessons : • Information can be represented in many ways. • Get it wrong, and you will be sorry! ❉✐❣✐t❛❧ ❊q✉✐♣♠❡♥t ❈♦r♣♦r❛t✐♦♥✬s ❞❛t❡ ❝r✐s✐s ♦❝❝✉rr❡❞ ✐♥ ✶✾✼✺✳ ❚❤❡ P❉P✲ ✶✵ ✇❛s ❛ ✸✻✲❜✐t ♠❛✐♥❢r❛♠❡ ❝♦♠♣✉t❡r✳ ■t r❡♣r❡s❡♥t❡❞ ❞❛t❡s ✉s✐♥❣ ❛ ✶✷✲❜✐t ❢♦r♠❛t ❞❡s✐❣♥❡❞ ❢♦r t❤❡ t✐♥② P❉P✲✽✳ ❲✐t❤ ✶✷ ❜✐ts✱ ♦♥❡ ❝❛♥ ❞✐st✐♥❣✉✐s❤ 2 12 = 4096 ❞❛②s ♦r ✶✶ ②❡❛rs✳ ❚❤❡ ♠♦st ❝♦♠♠♦♥ ✐♥❞✉str② ❢♦r♠❛t ❢♦r ❞❛t❡s ✉s❡s s✐① ❝❤❛r❛❝t❡rs✿ t✇♦ ❢♦r t❤❡ ②❡❛r✱ t✇♦ ❢♦r t❤❡ ♠♦♥t❤ ❛♥❞ t✇♦ ❢♦r t❤❡ ❞❛②✳ ❚❤❡ ♠♦st ❝♦♠♠♦♥ ✏s♦❧✉t✐♦♥✑ t♦ t❤❡ ②❡❛r ✷✵✵✵ ❝r✐s✐s ✐s t♦ ❛❞❞ t✇♦ ❢✉rt❤❡r ❝❤❛r❛❝t❡rs✱ t❤❡r❡❜② ❛❧t❡r✐♥❣ ✜❧❡ s✐③❡s✳ ❖t❤❡rs ❤❛✈❡ ♥♦t✐❝❡❞ t❤❛t t❤❡ ❡①✐st✐♥❣ s✐① ❝❤❛r❛❝t❡rs ❝♦♥s✐st ♦❢ ✹✽ ❜✐ts✱ ❛❧r❡❛❞② s✉✣❝✐❡♥t t♦ r❡♣r❡s❡♥t ❛❧❧ ❞❛t❡s ♦✈❡r t❤❡ ♣r♦❥❡❝t❡❞ ❧✐❢❡t✐♠❡ ♦❢ t❤❡ ✉♥✐✈❡rs❡✿ 2 48 = 2 . 8 × 10 14 ❞❛②s = 7 . 7 × 10 11 ②❡❛rs✦ ▼❛t❤❡♠❛t✐❝✐❛♥s t❤✐♥❦ ✐♥ t❡r♠s ♦❢ ✉♥❜♦✉♥❞❡❞ r❛♥❣❡s✱ ❜✉t t❤❡ r❡♣r❡s❡♥✲ t❛t✐♦♥ ✇❡ ❝❤♦♦s❡ ❢♦r t❤❡ ❝♦♠♣✉t❡r ✉s✉❛❧❧② ✐♠♣♦s❡s ❤❛r❞ ❧✐♠✐ts✳ ❆ ❣♦♦❞ ♣r♦✲ ❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡ ❧✐❦❡ ▼▲ ❧❡ts ♦♥❡ ❡❛s✐❧② ❝❤❛♥❣❡ t❤❡ r❡♣r❡s❡♥t❛t✐♦♥ ✉s❡❞ ✐♥ t❤❡ ♣r♦❣r❛♠✳ ❇✉t ✐❢ ✜❧❡s ✐♥ t❤❡ ♦❧❞ r❡♣r❡s❡♥t❛t✐♦♥ ❡①✐st ❛❧❧ ♦✈❡r t❤❡ ♣❧❛❝❡✱ t❤❡r❡ ✇✐❧❧ st✐❧❧ ❜❡ ❝♦♥✈❡rs✐♦♥ ♣r♦❜❧❡♠s✳ ❚❤❡ ♥❡❡❞ ❢♦r ❝♦♠♣❛t✐❜✐❧✐t② ✇✐t❤ ♦❧❞❡r s②st❡♠s ❝❛✉s❡s ♣r♦❜❧❡♠s ❛❝r♦ss t❤❡ ❝♦♠♣✉t❡r ✐♥❞✉str②✳

  2. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹ Example II: Floating-Point Numbers Computers have integers like 1066 and reals like 1 . 066 × 10 3 . A floating-point number is represented by two integers. Slide 103 Both types come in different precisions : their range and accuracy. The concept of DATA TYPE comprises • how a value is represented inside the computer, and • the suite of operations given to programmers. ❋❧♦❛t✐♥❣ ♣♦✐♥t ♥✉♠❜❡rs ❛r❡ ✇❤❛t ②♦✉ ❣❡t ♦♥ ❛♥② ♣♦❝❦❡t ❝❛❧❝✉❧❛t♦r✳ ■♥✲ t❡r♥❛❧❧②✱ ❛ ✢♦❛t ❝♦♥s✐sts ♦❢ t✇♦ ✐♥t❡❣❡rs✿ t❤❡ ♠❛♥t✐ss❛ ✭❢r❛❝t✐♦♥❛❧ ♣❛rt✮ ❛♥❞ t❤❡ ❡①♣♦♥❡♥t ✳ ❈♦♠♣❧❡① ♥✉♠❜❡rs✱ ❝♦♥s✐st✐♥❣ ♦❢ t✇♦ r❡❛❧s✱ ♠✐❣❤t ❜❡ ♣r♦✈✐❞❡❞✳ ❲❡ ❤❛✈❡ t❤r❡❡ ❧❡✈❡❧s ♦❢ ♥✉♠❜❡rs ❛❧r❡❛❞②✦ ▼♦st ❝♦♠♣✉t❡rs ❣✐✈❡ ✉s ❛ ❝❤♦✐❝❡ ♦❢ ♣r❡❝✐s✐♦♥s✱ t♦♦✳ ■♥ ✸✷✲❜✐t ♣r❡❝✐s✐♦♥✱ ✐♥t❡❣❡rs t②♣✐❝❛❧❧② r❛♥❣❡ ❢r♦♠ 2 31 − 1 ✭♥❛♠❡❧② ✷✱✶✹✼✱✹✽✸✱✻✹✼✮ t♦ − 2 31 ❀ r❡❛❧s ❛r❡ ❛❝❝✉r❛t❡ t♦ ❛❜♦✉t s✐① ❞❡❝✐♠❛❧ ♣❧❛❝❡s ❛♥❞ ❝❛♥ ❣❡t ❛s ❧❛r❣❡ ❛s 10 35 ♦r s♦✳ ❋♦r r❡❛❧s✱ ✻✹✲❜✐t ♣r❡❝✐s✐♦♥ ✐s ♦❢t❡♥ ♣r❡❢❡rr❡❞✳ ❍♦✇ ❞♦ ✇❡ ❦❡❡♣ tr❛❝❦ ♦❢ s♦ ♠❛♥② ❦✐♥❞s ♦❢ ♥✉♠❜❡rs❄ ■❢ ✇❡ ❛♣♣❧② ✢♦❛t✐♥❣✲♣♦✐♥t ❛r✐t❤♠❡t✐❝ t♦ ❛♥ ✐♥t❡❣❡r✱ t❤❡ r❡s✉❧t ✐s ✉♥❞❡✜♥❡❞ ❛♥❞ ♠✐❣❤t ❡✈❡♥ ✈❛r② ❢r♦♠ ♦♥❡ ✈❡rs✐♦♥ ♦❢ ❛ ❝❤✐♣ t♦ ❛♥♦t❤❡r✳ ❊❛r❧② ❧❛♥❣✉❛❣❡s ❧✐❦❡ ❋♦rtr❛♥ r❡q✉✐r❡❞ ✈❛r✐❛❜❧❡s t♦ ❜❡ ❞❡❝❧❛r❡❞ ❛s ✐♥t❡❣❡r ♦r r❡❛❧ ❛♥❞ ♣r❡✈❡♥t❡❞ ♣r♦❣r❛♠♠❡rs ❢r♦♠ ♠✐①✐♥❣ ❜♦t❤ ❦✐♥❞s ♦❢ ♥✉♠❜❡r ✐♥ ❛ ❝♦♠♣✉t❛t✐♦♥✳ ◆♦✇❛❞❛②s✱ ♣r♦❣r❛♠s ❤❛♥❞❧❡ ♠❛♥② ❞✐✛❡r❡♥t ❦✐♥❞s ♦❢ ❞❛t❛✱ ✐♥❝❧✉❞✐♥❣ t❡①t ❛♥❞ s②♠❜♦❧s✳ ▼♦❞❡r♥ ❧❛♥❣✉❛❣❡s ✉s❡ t❤❡ ❝♦♥❝❡♣t ♦❢ ❞❛t❛ t②♣❡ t♦ ❡♥s✉r❡ t❤❛t ❛ ❞❛t✉♠ ✉♥❞❡r❣♦❡s ♦♥❧② t❤♦s❡ ♦♣❡r❛t✐♦♥s t❤❛t ❛r❡ ♠❡❛♥✐♥❣❢✉❧ ❢♦r ✐t✳ ■♥s✐❞❡ t❤❡ ❝♦♠♣✉t❡r✱ ❛❧❧ ❞❛t❛ ❛r❡ st♦r❡❞ ❛s ❜✐ts✳ ❉❡t❡r♠✐♥✐♥❣ ✇❤✐❝❤ t②♣❡ ❛ ♣❛rt✐❝✉❧❛r ❜✐t ♣❛tt❡r♥ ❜❡❧♦♥❣s t♦ ✐s ✐♠♣♦ss✐❜❧❡ ✉♥❧❡ss s♦♠❡ ❜✐ts ❤❛✈❡ ❜❡❡♥ s❡t ❛s✐❞❡ ❢♦r t❤❛t ✈❡r② ♣✉r♣♦s❡ ✭❛s ✐♥ ❧❛♥❣✉❛❣❡s ❧✐❦❡ ▲✐s♣ ❛♥❞ Pr♦❧♦❣✮✳ ■♥ ♠♦st ❧❛♥❣✉❛❣❡s✱ t❤❡ ❝♦♠♣✐❧❡r ✉s❡s t②♣❡s t♦ ❣❡♥❡r❛t❡ ❝♦rr❡❝t ♠❛❝❤✐♥❡ ❝♦❞❡✱ ❛♥❞ t②♣❡s ❛r❡ ♥♦t st♦r❡❞ ❞✉r✐♥❣ ♣r♦❣r❛♠ ❡①❡❝✉t✐♦♥✳

  3. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺ Some Abstraction Levels in a Computer programmer high-level language operating system Slide 104 device drivers, . . . machine language registers & processors gates silicon ❚❤❡s❡ ❛r❡ ❥✉st s♦♠❡ ♦❢ t❤❡ ❧❡✈❡❧s t❤❛t ♠✐❣❤t ❜❡ ✐❞❡♥t✐✜❡❞ ✐♥ ❛ ❝♦♠♣✉t❡r✳ ▼♦st ❧❛r❣❡✲s❝❛❧❡ s②st❡♠s ❛r❡ t❤❡♠s❡❧✈❡s ❞✐✈✐❞❡❞ ✐♥t♦ ❧❡✈❡❧s✳ ❋♦r ❡①❛♠♣❧❡✱ ❛ ♠❛♥❛❣❡♠❡♥t ✐♥❢♦r♠❛t✐♦♥ s②st❡♠ ♠❛② ❝♦♥s✐st ♦❢ s❡✈❡r❛❧ ❞❛t❛❜❛s❡ s②st❡♠s ❜♦❧t❡❞ t♦❣❡t❤❡r ♠♦r❡✲♦r✲❧❡ss ❡❧❡❣❛♥t❧②✳ ❚❤✐s ✐s t❤❡ ♣r♦❣r❛♠♠❡r✬s ✈✐❡✇✳ ❚❤❡ ✉s❡r s❡❡s ❛ ❞✐✛❡r❡♥t ❤✐❡r❛r❝❤②✱ ❞❡✲ t❡r♠✐♥❡❞ ❜② t❤❡ s❡♣❛r❛t❡ ❛♣♣❧✐❝❛t✐♦♥ ♣r♦❣r❛♠s✱ t❤❡ ♦♣❡r❛t✐♥❣ s②st❡♠✱ ❛♥❞ t❤❡ ✈✐s✐❜❧❡ ❤❛r❞✇❛r❡ s✉❝❤ ❛s t❤❡ s❝r❡❡♥ ❛♥❞ ❉❱❉✲✇r✐t❡r✳ ❍♦♠❡ ❝♦♠♣✉t✲ ❡rs ❛r❡ ♣♦ss✐❜❧❡ ❜❡❝❛✉s❡ t❤❡ ✉s❡r✬s ✈✐❡✇ ❝❛♥ ❜❡ s♦ ♠✉❝❤ s✐♠♣❧❡r t❤❛♥ t❤❡ ♣r♦❣r❛♠♠❡r✬s✳ ❈♦♠♠✉♥✐❝❛t✐♦♥s ♣r♦t♦❝♦❧s ✉s❡❞ ♦♥ t❤❡ ■♥t❡r♥❡t ❡♥❝♦♠♣❛ss s❡✈❡r❛❧ ❧❛②❡rs✳ ❊❛❝❤ ❧❛②❡r ❤❛s ❛ ❞✐✛❡r❡♥t t❛s❦✱ s✉❝❤ ❛s ♠❛❦✐♥❣ ✉♥r❡❧✐❛❜❧❡ ❧✐♥❦s r❡❧✐❛❜❧❡ ✭❜② tr②✐♥❣ ❛❣❛✐♥ ✐❢ ❛ tr❛♥s♠✐ss✐♦♥ ✐s ♥♦t ❛❝❦♥♦✇❧❡❞❣❡❞✮ ❛♥❞ ♠❛❦✐♥❣ ✐♥s❡❝✉r❡ ❧✐♥❦s s❡❝✉r❡ ✭✉s✐♥❣ ❝r②♣t♦❣r❛♣❤②✮✳ ■t s♦✉♥❞s ❝♦♠♣❧✐❝❛t❡❞✱ ❜✉t t❤❡ ♥❡❝❡ss❛r② s♦❢t✇❛r❡ ❝❛♥ ❜❡ ❢♦✉♥❞ ♦♥ ♠❛♥② ♣❡rs♦♥❛❧ ❝♦♠♣✉t❡rs✳ ■♥ t❤✐s ❝♦✉rs❡✱ ✇❡ ❢♦❝✉s ❛❧♠♦st ❡♥t✐r❡❧② ♦♥ ♣r♦❣r❛♠♠✐♥❣ ✐♥ ❛ ❤✐❣❤✲❧❡✈❡❧ ❧❛♥❣✉❛❣❡ ✿ ▼▲✳

  4. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻ What is Programming? • to describe a computation so that it can be done mechanically : — Expressions compute values . — Commands cause effects . Slide 105 • to do so efficiently , in both coding & execution • to do so CORRECTLY , solving the right problem • to allow easy modification as needs change • to give LARGE programs a rational structure that others can comprehend and extend Pr♦❣r❛♠♠✐♥❣ ✐♥✲t❤❡✲s♠❛❧❧ ❝♦♥❝❡r♥s t❤❡ ✇r✐t✐♥❣ ♦❢ ❝♦❞❡ t♦ ❞♦ s✐♠♣❧❡✱ ❝❧❡❛r❧② ❞❡✜♥❡❞ t❛s❦s✳ Pr♦❣r❛♠s ♣r♦✈✐❞❡ ❡①♣r❡ss✐♦♥s ❢♦r ❞❡s❝r✐❜✐♥❣ ♠❛t❤❡✲ ♠❛t✐❝❛❧ ❢♦r♠✉❧❛❡ ❛♥❞ s♦ ❢♦rt❤✳ ✭❚❤✐s ✇❛s t❤❡ ♦r✐❣✐♥❛❧ ❝♦♥tr✐❜✉t✐♦♥ ♦❢ ❋♦r✲ tr❛♥ ✱ t❤❡ ❢♦r ♠✉❧❛ tr❛♥ s❧❛t♦r✳ ❈♦♠♠❛♥❞s ❞❡s❝r✐❜❡ ❤♦✇ ❝♦♥tr♦❧ s❤♦✉❧❞ ✢♦✇ ❢r♦♠ ♦♥❡ ♣❛rt ♦❢ t❤❡ ♣r♦❣r❛♠ t♦ t❤❡ ♥❡①t✳ ❆s ✇❡ ❝♦❞❡ ❧❛②❡r ✉♣♦♥ ❧❛②❡r ✐♥ t❤❡ ✉s✉❛❧ ✇❛②✱ ✇❡ ❡✈❡♥t✉❛❧❧② ✜♥❞ ♦✉rs❡❧✈❡s ♣r♦❣r❛♠♠✐♥❣ ✐♥✲t❤❡✲❧❛r❣❡ ✿ ❥♦✐♥✐♥❣ ❧❛r❣❡ ♠♦❞✉❧❡s t♦ s♦❧✈❡ s♦♠❡ ♣♦ss✐❜❧② ✐❧❧✲ ❞❡✜♥❡❞ t❛s❦✳ ■t ❜❡❝♦♠❡s ❛ ❝❤❛❧❧❡♥❣❡ ✐❢ t❤❡ ♠♦❞✉❧❡s ✇❡r❡ ♥❡✈❡r ✐♥t❡♥❞❡❞ t♦ ✇♦r❦ t♦❣❡t❤❡r ✐♥ t❤❡ ✜rst ♣❧❛❝❡✳ Pr♦❣r❛♠♠❡rs ♥❡❡❞ ❛ ✈❛r✐❡t② ♦❢ s❦✐❧❧s✿ • t♦ ❝♦♠♠✉♥✐❝❛t❡ r❡q✉✐r❡♠❡♥ts ✱ s♦ t❤❡② s♦❧✈❡ t❤❡ r✐❣❤t ♣r♦❜❧❡♠ • t♦ ❛♥❛❧②③❡ ♣r♦❜❧❡♠s ✱ ❜r❡❛❦✐♥❣ t❤❡♠ ❞♦✇♥ ✐♥t♦ s♠❛❧❧❡r ♣❛rts • t♦ ♦r❣❛♥✐③❡ s♦❧✉t✐♦♥s s❡♥s✐❜❧②✱ s♦ t❤❛t t❤❡② ❝❛♥ ❜❡ ✉♥❞❡rst♦♦❞ ❛♥❞ ♠♦❞✐✜❡❞ • t♦ ❡st✐♠❛t❡ ❝♦sts ✱ ❦♥♦✇✐♥❣ ✐♥ ❛❞✈❛♥❝❡ ✇❤❡t❤❡r ❛ ❣✐✈❡♥ ❛♣♣r♦❛❝❤ ✐s ❢❡❛s✐❜❧❡ • t♦ ✉s❡ ♠❛t❤❡♠❛t✐❝s t♦ ❛rr✐✈❡ ❛t ❝♦rr❡❝t ❛♥❞ s✐♠♣❧❡ s♦❧✉t✐♦♥s ❲❡ s❤❛❧❧ ❧♦♦❦ ❛t ❛❧❧ t❤❡s❡ ♣♦✐♥ts ❞✉r✐♥❣ t❤❡ ❝♦✉rs❡✱ t❤♦✉❣❤ ♣r♦❣r❛♠s ✇✐❧❧ ❜❡ t♦♦ s✐♠♣❧❡ t♦ ❤❛✈❡ ♠✉❝❤ r✐s❦ ♦❢ ❣❡tt✐♥❣ t❤❡ r❡q✉✐r❡♠❡♥ts ✇r♦♥❣✳

  5. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼ Abstraction in Programming • Application Programming Interfaces , or APIs (Windows, Mac) : —controlled access to operating systems facilities, etc. • Modules (ML and many post-1980 languages) : Slide 106 —controlled access to a body of code • Abstract Data Types , or ADTs (various early languages) : —controlled access to a hidden data structure • Classes and objects : (Java, C++, Smalltalk, . . . ) —intermixed data structures and code —built into elaborate hierarchies ❊❛❝❤ ♦❢ t❤❡s❡ ♠❡❝❤❛♥✐s♠s ❤❛s ❛ ❝♦♠♠♦♥ ♣✉r♣♦s❡✿ t♦ ♣r♦✈✐❞❡ s❡r✈✐❝❡s t♦ ♣r♦❣r❛♠♠❡rs ✇❤✐❧❡ ❤✐❞✐♥❣ t❤❡ ❞❡t❛✐❧s ♦❢ ❤♦✇ t❤♦s❡ s❡r✈✐❝❡s ❛r❡ ✐♠♣❧❡♠❡♥t❡❞✳ ❋♦r❝✐♥❣ ♣r♦❣r❛♠♠❡rs t♦ ✉s❡ ❛ st❛♥❞❛r❞ ✐♥t❡r❢❛❝❡ ❤❡❧♣s t♦ ❡♥s✉r❡ t❤❛t t❤❡ s②st❡♠ ✇✐❧❧ st✐❧❧ ✇♦r❦ ✐❢ t❤❡ ✐♠♣❧❡♠❡♥t❛t✐♦♥ ❝❤❛♥❣❡s✳ ❙♦❢t✇❛r❡ t❤❛t r❡❢❡rs t♦ t❤❡ ❲✐♥❞♦✇s ❆P■s ❝❛♥ ❜❡ ❡①♣❡❝t❡❞ t♦ r✉♥ ♦♥ ♠❛♥② ❞✐✛❡r❡♥t ✈❡rs✐♦♥s ♦❢ ❲✐♥❞♦✇s t❤❛t ❤❛✈❡ ♠❛❥♦r ✐♥t❡r♥❛❧ ❞✐✛❡r❡♥❝❡s✳ ❆♥ ❆P■ ♠✐❣❤t ♣r♦✈✐❞❡ r♦✉t✐♥❡s t♦ ❞❡❧❡t❡ ❛ ✜❧❡ ♦r t♦ ❞r❛✇ ❛ ♠❡♥✉✳ Pr♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❤❛✈❡ ✉s❡❞ ✈❛r✐♦✉s ♠❡❝❤❛♥✐s♠s t♦ ❛❧❧♦✇ ♦♥❡ ♣❛rt ♦❢ t❤❡ ♣r♦❣r❛♠ t♦ ♣r♦✈✐❞❡ ❆P■s t♦ ♦t❤❡r ♣❛rts✳ ▼♦❞✉❧❡s ❡♥❝❛♣s✉❧❛t❡ ❛ ❜♦❞② ♦❢ ❝♦❞❡✱ ❛❧❧♦✇✐♥❣ ♦✉ts✐❞❡ ❛❝❝❡ss ♦♥❧② t❤r♦✉❣❤ ❛ ♣r♦❣r❛♠♠❡r✲❞❡✜♥❡❞ ✐♥t❡r❢❛❝❡✳ ❆❜str❛❝t ❉❛t❛ ❚②♣❡s ❛r❡ ❛ s✐♠♣❧❡r ✈❡rs✐♦♥ ♦❢ t❤✐s ❝♦♥❝❡♣t✱ ✇❤✐❝❤ ✐♠♣❧❡♠❡♥t ❛ s✐♥❣❧❡ ❝♦♥❝❡♣t s✉❝❤ ❛s ❞❛t❡s ♦r ✢♦❛t✐♥❣✲♣♦✐♥t ♥✉♠❜❡rs✳ ❖❜❥❡❝t✲♦r✐❡♥t❡❞ ♣r♦❣r❛♠♠✐♥❣ ✐s t❤❡ ❧❛t❡st ❛♥❞ ♠♦st ❝♦♠♣❧✐❝❛t❡❞ ❛♣♣r♦❛❝❤ t♦ ♠♦❞✉❧❛r✐t②✳ ❈❧❛ss❡s ❞❡✜♥❡ ❝♦♥❝❡♣ts✱ ❛♥❞ t❤❡② ❝❛♥ ❜❡ ❜✉✐❧t ✉♣♦♥ ♦t❤❡r ❝❧❛ss❡s✳ ❖♣❡r❛t✐♦♥s ❝❛♥ ❜❡ ❞❡✜♥❡❞ t❤❛t ✇♦r❦ ✐♥ ❛♣♣r♦♣r✐❛t❡❧② s♣❡❝✐❛❧✐③❡❞ ✇❛②s ♦♥ ❛ ❢❛♠✐❧② ♦❢ r❡❧❛t❡❞ ❝❧❛ss❡s✳ ❖❜❥❡❝ts ❛r❡ ✐♥st❛♥❝❡s ♦❢ ❝❧❛ss❡s ❛♥❞ ❤♦❧❞ t❤❡ ❞❛t❛ t❤❛t ✐s ❜❡✐♥❣ ♠❛♥✐♣✉❧❛t❡❞✳ ❚❤✐s ❝♦✉rs❡ ❞♦❡s ♥♦t ❝♦✈❡r ❙t❛♥❞❛r❞ ▼▲✬s s♦♣❤✐st✐❝❛t❡❞ ♠♦❞✉❧❡ s②st❡♠✱ ✇❤✐❝❤ ❝❛♥ ❞♦ ♠❛♥② ♦❢ t❤❡ s❛♠❡ t❤✐♥❣s ❛s ❝❧❛ss❡s✳ ❨♦✉ ✇✐❧❧ ❧❡❛r♥ ❛❧❧ ❛❜♦✉t ♦❜❥❡❝ts ✐♥ t❤❡ ❏❛✈❛ ❝♦✉rs❡✳

  6. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽ Floating-Point, Revisited Results are ALWAYS wrong—do we know how wrong? Von Neumann doubted whether its benefits outweighed its COSTS ! Slide 107 Lessons : • Innovations are often derided as luxuries for lazy people . • Their HIDDEN COSTS can be worse than the obvious ones. • luxuries often become necessities . ❋❧♦❛t✐♥❣✲♣♦✐♥t ✐s t❤❡ ❜❛s✐s ❢♦r ♥✉♠❡r✐❝❛❧ ❝♦♠♣✉t❛t✐♦♥✿ ✐♥❞✐s♣❡♥s❛❜❧❡ ❢♦r s❝✐❡♥❝❡ ❛♥❞ ❡♥❣✐♥❡❡r✐♥❣✳ ◆♦✇ r❡❛❞ t❤✐s ❬✹✱ ♣❛❣❡ ✾✼❪ ■t ✇♦✉❧❞ t❤❡r❡❢♦r❡ s❡❡♠ t♦ ✉s ♥♦t ❛t ❛❧❧ ❝❧❡❛r ✇❤❡t❤❡r t❤❡ ♠♦❞❡st ❛❞✈❛♥t❛❣❡s ♦❢ ❛ ✢♦❛t✐♥❣ ❜✐♥❛r② ♣♦✐♥t ♦✛s❡t t❤❡ ❧♦ss ♦❢ ♠❡♠♦r② ❝❛♣❛❝✐t② ❛♥❞ t❤❡ ✐♥❝r❡❛s❡❞ ❝♦♠♣❧❡①✐t② ♦❢ t❤❡ ❛r✐t❤♠❡t✐❝ ❛♥❞ ❝♦♥tr♦❧ ❝✐r❝✉✐ts✳ ❱♦♥ ◆❡✉♠❛♥♥ ✇❛s ♦♥❡ ♦❢ t❤❡ ❣r❡❛t❡st ✜❣✉r❡s ✐♥ t❤❡ ❡❛r❧② ❞❛②s ♦❢ ❝♦♠♣✉t✐♥❣✳ ❍♦✇ ❝♦✉❧❞ ❤❡ ❣❡t ✐t s♦ ✇r♦♥❣❄ ■t ❤❛♣♣❡♥s ❛❣❛✐♥ ❛♥❞ ❛❣❛✐♥✿ • ❚✐♠❡✲s❤❛r✐♥❣ ✭s✉♣♣♦rt✐♥❣ ♠✉❧t✐♣❧❡ ✐♥t❡r❛❝t✐✈❡ s❡ss✐♦♥s✱ ❛s ♦♥ t❤♦r✮ ✇❛s ❢♦r ♣❡♦♣❧❡ t♦♦ ❧❛③② t♦ q✉❡✉❡ ✉♣ ❤♦❧❞✐♥❣ ❞❡❝❦s ♦❢ ♣✉♥❝❤❡❞ ❝❛r❞s✳ • ❆✉t♦♠❛t✐❝ st♦r❛❣❡ ♠❛♥❛❣❡♠❡♥t ✭✉s✉❛❧❧② ❝❛❧❧❡❞ ❣❛r❜❛❣❡ ❝♦❧❧❡❝t✐♦♥ ✮ ✇❛s ❢♦r ♣❡♦♣❧❡ t♦♦ ❧❛③② t♦ ❞♦ t❤❡ ❥♦❜ t❤❡♠s❡❧✈❡s✳ • ❙❝r❡❡♥ ❡❞✐t♦rs ✇❡r❡ ❢♦r ♣❡♦♣❧❡ t♦♦ ❧❛③② t♦ ✉s❡ ❧✐♥❡✲♦r✐❡♥t❡❞ ❡❞✐t♦rs✳ ❚♦ ❜❡ ❢❛✐r✱ s♦♠❡ ✐♥♥♦✈❛t✐♦♥s ❜❡❝❛♠❡ ❡st❛❜❧✐s❤❡❞ ♦♥❧② ❛❢t❡r ❤❛r❞✇❛r❡ ❛❞✈❛♥❝❡s r❡❞✉❝❡❞ t❤❡✐r ❝♦sts✳ ❋❧♦❛t✐♥❣✲♣♦✐♥t ❛r✐t❤♠❡t✐❝ ✐s ✉s❡❞✱ ❢♦r ❡①❛♠♣❧❡✱ t♦ ❞❡s✐❣♥ ❛✐r❝r❛❢t✖❜✉t ✇♦✉❧❞ ②♦✉ ✢② ✐♥ ♦♥❡❄ ❈♦❞❡ ❝❛♥ ❜❡ ❝♦rr❡❝t ❛ss✉♠✐♥❣ ❡①❛❝t ❛r✐t❤♠❡t✐❝ ❜✉t ❞❡❧✐✈❡r✱ ✉♥❞❡r ✢♦❛t✐♥❣✲♣♦✐♥t✱ ✇✐❧❞❧② ✐♥❛❝❝✉r❛t❡ r❡s✉❧ts✳ ❚❤❡ r✐s❦ ♦❢ ❡rr♦r ♦✉t✇❡✐❣❤s t❤❡ ✐♥❝r❡❛s❡❞ ❝♦♠♣❧❡①✐t② ♦❢ t❤❡ ❝✐r❝✉✐ts✿ ❛ ❤✐❞❞❡♥ ❝♦st✦ ❆s ✐t ❤❛♣♣❡♥s✱ t❤❡r❡ ❛r❡ ♠❡t❤♦❞s ❢♦r ❞❡t❡r♠✐♥✐♥❣ ❤♦✇ ❛❝❝✉r❛t❡ ♦✉r ❛♥✲ s✇❡rs ❛r❡✳ ❆ ♣r♦❢❡ss✐♦♥❛❧ ♣r♦❣r❛♠♠❡r ✇✐❧❧ ✉s❡ t❤❡♠✳

  7. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾ Why Program in ML? It is interactive. It has a flexible notion of data type . Slide 108 It hides the underlying hardware: no crashes . Programs can easily be understood mathematically. It distinguishes naming something from UPDATING MEMORY . It manages storage for us. ▼▲ ✐s t❤❡ ♦✉t❝♦♠❡ ♦❢ ②❡❛rs ♦❢ r❡s❡❛r❝❤ ✐♥t♦ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✳ ■t ✐s ✉♥✐q✉❡ ❛♠♦♥❣ ❧❛♥❣✉❛❣❡s t♦ ❜❡ ❞❡✜♥❡❞ ✉s✐♥❣ ❛ ♠❛t❤❡♠❛t✐❝❛❧ ❢♦r♠❛❧✐s♠ ✭❛♥ ♦♣❡r❛t✐♦♥❛❧ s❡♠❛♥t✐❝s ✮ t❤❛t ✐s ❜♦t❤ ♣r❡❝✐s❡ ❛♥❞ ❝♦♠♣r❡❤❡♥s✐❜❧❡✳ ❙❡✈❡r❛❧ ❝♦♠♠❡r❝✐❛❧❧② s✉♣♣♦rt❡❞ ❝♦♠♣✐❧❡rs ❛r❡ ❛✈❛✐❧❛❜❧❡✱ ❛♥❞ t❤❛♥❦s t♦ t❤❡ ❢♦r♠❛❧ ❞❡✜♥✐t✐♦♥✱ t❤❡r❡ ❛r❡ r❡♠❛r❦❛❜❧② ❢❡✇ ✐♥❝♦♠♣❛t✐❜✐❧✐t✐❡s ❛♠♦♥❣ t❤❡♠✳ ❇❡❝❛✉s❡ ♦❢ ✐ts ❝♦♥♥❡❝t✐♦♥ t♦ ♠❛t❤❡♠❛t✐❝s✱ ▼▲ ♣r♦❣r❛♠s ❝❛♥ ❜❡ ❞❡s✐❣♥❡❞ ❛♥❞ ✉♥❞❡rst♦♦❞ ✇✐t❤♦✉t t❤✐♥❦✐♥❣ ✐♥ ❞❡t❛✐❧ ❛❜♦✉t ❤♦✇ t❤❡ ❝♦♠♣✉t❡r ✇✐❧❧ r✉♥ t❤❡♠✳ ❆❧t❤♦✉❣❤ ❛ ♣r♦❣r❛♠ ❝❛♥ ❛❜♦rt✱ ✐t ❝❛♥♥♦t ❝r❛s❤✿ ✐t r❡♠❛✐♥s ✉♥❞❡r t❤❡ ❝♦♥tr♦❧ ♦❢ t❤❡ ▼▲ s②st❡♠✳ ■t st✐❧❧ ❛❝❤✐❡✈❡s r❡s♣❡❝t❛❜❧❡ ❡✣❝✐❡♥❝② ❛♥❞ ♣r♦✲ ✈✐❞❡s ❧♦✇❡r✲❧❡✈❡❧ ♣r✐♠✐t✐✈❡s ❢♦r t❤♦s❡ ✇❤♦ ♥❡❡❞ t❤❡♠✳ ▼♦st ♦t❤❡r ❧❛♥❣✉❛❣❡s ❛❧❧♦✇ ❞✐r❡❝t ❛❝❝❡ss t♦ t❤❡ ✉♥❞❡r❧②✐♥❣ ♠❛❝❤✐♥❡ ❛♥❞ ❡✈❡♥ tr② t♦ ❡①❡❝✉t❡ ✐❧❧❡❣❛❧ ♦♣❡r❛t✐♦♥s✱ ❝❛✉s✐♥❣ ❝r❛s❤❡s✳ ❚❤❡ ♦♥❧② ✇❛② t♦ ❧❡❛r♥ ♣r♦❣r❛♠♠✐♥❣ ✐s ❜② ✇r✐t✐♥❣ ❛♥❞ r✉♥♥✐♥❣ ♣r♦❣r❛♠s✳ ■❢ ②♦✉ ❤❛✈❡ ❛ ❝♦♠♣✉t❡r✱ ✐♥st❛❧❧ ▼▲ ♦♥ ✐t✳ ■ r❡❝♦♠♠❡♥❞ ▼♦s❝♦✇ ▼▲✱ ✶ ✇❤✐❝❤ r✉♥s ♦♥ P❈s✱ ▼❛❝✐♥t♦s❤❡s ❛♥❞ ❯♥✐① ❛♥❞ ✐s ❢❛st ❛♥❞ s♠❛❧❧✳ ■t ❝♦♠❡s ✇✐t❤ ❡①t❡♥s✐✈❡ ❧✐❜r❛r✐❡s ❛♥❞ s✉♣♣♦rts t❤❡ ❢✉❧❧ ❧❛♥❣✉❛❣❡ ❡①❝❡♣t ❢♦r s♦♠❡ ❛s♣❡❝ts ♦❢ ♠♦❞✉❧❡s✱ ✇❤✐❝❤ ❛r❡ ♥♦t ❝♦✈❡r❡❞ ✐♥ t❤✐s ❝♦✉rs❡✳ ▼♦s❝♦✇ ▼▲ ✐s ❛❧s♦ ❛✈❛✐❧❛❜❧❡ ✉♥❞❡r P❲❋✳ ❈❛♠❜r✐❞❣❡ ▼▲ ✐s ❛♥ ❛❧t❡r♥❛t✐✈❡✳ ■t ♣r♦✈✐❞❡s ❛ ❲✐♥❞♦✇s✲❜❛s❡❞ ✐♥t❡r❢❛❝❡ ✭❞✉❡ t♦ ❆rt❤✉r ◆♦r♠❛♥✮✱ ❜✉t t❤❡ ❝♦♠♣✐❧❡r ✐ts❡❧❢ ✐s t❤❡ ♦❧❞ ❊❞✐♥❜✉r❣❤ ▼▲✱ ✇❤✐❝❤ ✐s s❧♦✇ ❛♥❞ ❜✉❣❣②✳ ■t s✉♣♣♦rts ❛♥ ♦✉t✲♦❢✲❞❛t❡ ✈❡rs✐♦♥ ♦❢ ▼▲✿ ♠❛♥② ♦❢ t❤❡ ❡①❛♠♣❧❡s ✐♥ ♠② ❜♦♦❦ ❬✶✸❪ ✇✐❧❧ ♥♦t ✇♦r❦✳ ✶ ❤tt♣✿✴✴✇✇✇✳❞✐♥❛✳❦✈❧✳❞❦✴⑦s❡st♦❢t✴♠♦s♠❧✳❤t♠❧

  8. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✵ The Area of a Circle: A = πr 2 val pi = 3.14159; > val pi = 3.14159 : real pi * 1.5 * 1.5; Slide 109 > val it = 7.0685775 : real fun area (r) = pi*r*r; > val area = fn : real -> real area 2.0; > val it = 12.56636 : real ❚❤❡ ✜rst ❧✐♥❡ ♦❢ t❤✐s s✐♠♣❧❡ ▼▲ s❡ss✐♦♥ ✐s ❛ ✈❛❧✉❡ ❞❡❝❧❛r❛t✐♦♥ ✳ ■t ♠❛❦❡s t❤❡ ♥❛♠❡ ♣✐ st❛♥❞ ❢♦r t❤❡ r❡❛❧ ♥✉♠❜❡r ✸✳✶✹✶✺✾✳ ✭❙✉❝❤ ♥❛♠❡s ❛r❡ ❝❛❧❧❡❞ ✐❞❡♥✲ t✐✜❡rs ✳✮ ▼▲ ❡❝❤♦❡s t❤❡ ♥❛♠❡ ✭ ♣✐ ✮ ❛♥❞ t②♣❡ ✭ r❡❛❧ ✮ ♦❢ t❤❡ ❞❡❝❧❛r❡❞ ✐❞❡♥t✐✜❡r✳ ❚❤❡ s❡❝♦♥❞ ❧✐♥❡ ❝♦♠♣✉t❡s t❤❡ ❛r❡❛ ♦❢ t❤❡ ❝✐r❝❧❡ ✇✐t❤ r❛❞✐✉s ✶✳✺ ✉s✐♥❣ t❤❡ ❢♦r♠✉❧❛ A = πr 2 ✳ ❲❡ ✉s❡ ♣✐ ❛s ❛♥ ❛❜❜r❡✈✐❛t✐♦♥ ❢♦r ✸✳✶✹✶✺✾✳ ▼✉❧t✐♣❧✐❝❛t✐♦♥ ✐s ❡①♣r❡ss❡❞ ✉s✐♥❣ ✯ ✱ ✇❤✐❝❤ ✐s ❝❛❧❧❡❞ ❛♥ ✐♥✜① ♦♣❡r❛t♦r ❜❡❝❛✉s❡ ✐t ✐s ✇r✐tt❡♥ ❜❡t✇❡❡♥ ✐ts t✇♦ ♦♣❡r❛♥❞s✳ ▼▲ r❡♣❧✐❡s ✇✐t❤ t❤❡ ❝♦♠♣✉t❡❞ ✈❛❧✉❡ ✭❛❜♦✉t ✼✳✵✼✮ ❛♥❞ ✐ts t②♣❡ ✭❛❣❛✐♥ r❡❛❧ ✮✳ ❙tr✐❝t❧② s♣❡❛❦✐♥❣✱ ✇❡ ❤❛✈❡ ❞❡❝❧❛r❡❞ t❤❡ ✐❞❡♥t✐✜❡r ✐t ✱ ✇❤✐❝❤ ▼▲ ♣r♦✲ ✈✐❞❡s t♦ ❧❡t ✉s r❡❢❡r t♦ t❤❡ ✈❛❧✉❡ ♦❢ t❤❡ ❧❛st ❡①♣r❡ss✐♦♥ ❡♥t❡r❡❞ ❛t t♦♣ ❧❡✈❡❧✳ ❚♦ ✇♦r❦ ❛❜str❛❝t❧②✱ ✇❡ s❤♦✉❧❞ ♣r♦✈✐❞❡ t❤❡ s❡r✈✐❝❡ ✏❝♦♠♣✉t❡ t❤❡ ❛r❡❛ ♦❢ ❛ ❝✐r❝❧❡✱✑ s♦ t❤❛t ✇❡ ♥♦ ❧♦♥❣❡r ♥❡❡❞ t♦ r❡♠❡♠❜❡r t❤❡ ❢♦r♠✉❧❛✳ ❙♦✱ t❤❡ t❤✐r❞ ❧✐♥❡ ❞❡❝❧❛r❡s t❤❡ ❢✉♥❝t✐♦♥ ❛r❡❛ ✳ ●✐✈❡♥ ❛♥② r❡❛❧ ♥✉♠❜❡r r ✱ ✐t r❡t✉r♥s ❛♥♦t❤❡r r❡❛❧ ♥✉♠❜❡r✱ ❝♦♠♣✉t❡❞ ✉s✐♥❣ t❤❡ ❛r❡❛ ❢♦r♠✉❧❛❀ ♥♦t❡ t❤❛t t❤❡ ❢✉♥❝t✐♦♥ ❤❛s t②♣❡ r❡❛❧✲❃r❡❛❧ ✳ ❚❤❡ ❢♦✉rt❤ ❧✐♥❡ ❝❛❧❧s ❢✉♥❝t✐♦♥ ❛r❡❛ s✉♣♣❧②✐♥❣ ✷✳✵ ❛s t❤❡ ❛r❣✉♠❡♥t✳ ❆ ❝✐r❝❧❡ ♦❢ r❛❞✐✉s ✷ ❤❛s ❛♥ ❛r❡❛ ♦❢ ❛❜♦✉t ✶✷✳✻✳ ◆♦t❡ t❤❛t t❤❡ ❜r❛❝❦❡ts ❛r♦✉♥❞ ❛ ❢✉♥❝t✐♦♥✬s ❛r❣✉♠❡♥t ❛r❡ ♦♣t✐♦♥❛❧✱ ❜♦t❤ ✐♥ ❞❡❝❧❛r❛t✐♦♥ ❛♥❞ ✐♥ ✉s❡✳ ❚❤❡ ❢✉♥❝t✐♦♥ ✉s❡s ♣✐ t♦ st❛♥❞ ❢♦r ✸✳✶✹✶✺✾✳ ❯♥❧✐❦❡ ✇❤❛t ②♦✉ ♠❛② ❤❛✈❡ s❡❡♥ ✐♥ ♦t❤❡r ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✱ ♣✐ ❝❛♥♥♦t ❜❡ ✏❛ss✐❣♥❡❞ t♦✑ ♦r ♦t❤❡r✇✐s❡ ✉♣❞❛t❡❞✳ ■ts ♠❡❛♥✐♥❣ ✇✐t❤✐♥ ❛r❡❛ ✇✐❧❧ ♣❡rs✐st ❡✈❡♥ ✐❢ ✇❡ ✐ss✉❡ ❛ ♥❡✇ ✈❛❧ ❞❡❝❧❛r❛t✐♦♥ ❢♦r ♣✐ ❛❢t❡r✇❛r❞s✳

  9. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✶ Integers; Multiple Arguments & Results fun toSeconds (mins, secs) = secs + 60*mins; > val toSeconds = fn : int * int -> int fun fromSeconds s = (s div 60, s mod 60); Slide 110 > val fromSeconds = fn : int -> int * int toSeconds (5,7); > val it = 307 : int fromSeconds it; > val it = (5, 7) : int * int ●✐✈❡♥ t❤❛t t❤❡r❡ ❛r❡ ✻✵ s❡❝♦♥❞s ✐♥ ❛ ♠✐♥✉t❡✱ ❤♦✇ ♠❛♥② s❡❝♦♥❞s ❛r❡ t❤❡r❡ ✐♥ m ♠✐♥✉t❡s ❛♥❞ s s❡❝♦♥❞s❄ ❋✉♥❝t✐♦♥ t♦❙❡❝♦♥❞s ♣❡r❢♦r♠s t❤❡ tr✐✈✐❛❧ ❝❛❧❝✉❧❛t✐♦♥✳ ■t t❛❦❡s ❛ ♣❛✐r ♦❢ ❛r❣✉♠❡♥ts✱ ❡♥❝❧♦s❡❞ ✐♥ ❜r❛❝❦❡ts✳ ❲❡ ❛r❡ ♥♦✇ ✉s✐♥❣ ✐♥t❡❣❡rs✳ ❚❤❡ ✐♥t❡❣❡r s✐①t② ✐s ✇r✐tt❡♥ ✻✵ ❀ t❤❡ r❡❛❧ s✐①t② ✇♦✉❧❞ ❜❡ ✇r✐tt❡♥ ✻✵✳✵ ✳ ❚❤❡ ♠✉❧t✐♣❧✐❝❛t✐♦♥ ♦♣❡r❛t♦r✱ ✯ ✱ ✐s ✉s❡❞ ❢♦r t②♣❡ ✐♥t ❛s ✇❡❧❧ ❛s r❡❛❧ ✿ ✐t ✐s ♦✈❡r❧♦❛❞❡❞ ✳ ❚❤❡ ❛❞❞✐t✐♦♥ ♦♣❡r❛t♦r✱ ✰ ✱ ✐s ❛❧s♦ ♦✈❡r❧♦❛❞❡❞✳ ❆s ✐♥ ♠♦st ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✱ ♠✉❧t✐♣❧✐❝❛t✐♦♥ ✭❛♥❞ ❞✐✈✐s✐♦♥✮ ❤❛✈❡ ♣r❡❝❡❞❡♥❝❡ ♦✈❡r ❛❞❞✐t✐♦♥ ✭❛♥❞ s✉❜tr❛❝t✐♦♥✮✿ ✇❡ ♠❛② ✇r✐t❡ s❡❝s✰✻✵✯♠✐♥s ✐♥st❡❛❞ ♦❢ s❡❝s✰✭✻✵✯♠✐♥s✮ ❚❤❡ ✐♥✈❡rs❡ ♦❢ t♦❙❡❝♦♥❞s ❞❡♠♦♥str❛t❡s t❤❡ ✐♥✜① ♦♣❡r❛t♦rs ❞✐✈ ❛♥❞ ♠♦❞ ✱ ✇❤✐❝❤ ❡①♣r❡ss ✐♥t❡❣❡r ❞✐✈✐s✐♦♥ ❛♥❞ r❡♠❛✐♥❞❡r✳ ❋✉♥❝t✐♦♥ ❢r♦♠❙❡❝♦♥❞s r❡t✉r♥s ❛ ♣❛✐r ♦❢ r❡s✉❧ts✱ ❛❣❛✐♥ ❡♥❝❧♦s❡❞ ✐♥ ❜r❛❝❦❡ts✳ ❈❛r❡❢✉❧❧② ♦❜s❡r✈❡ t❤❡ t②♣❡s ♦❢ t❤❡ t✇♦ ❢✉♥❝t✐♦♥s✿ t♦❙❡❝♦♥❞s ✿ ✐♥t ✯ ✐♥t ✲❃ ✐♥t ❢r♦♠❙❡❝♦♥❞s ✿ ✐♥t ✲❃ ✐♥t ✯ ✐♥t ❚❤❡② t❡❧❧ ✉s t❤❛t t♦❙❡❝♦♥❞s ♠❛♣s ❛ ♣❛✐r ♦❢ ✐♥t❡❣❡rs t♦ ❛♥ ✐♥t❡❣❡r✱ ✇❤✐❧❡ ❢r♦♠❙❡❝♦♥❞s ♠❛♣s ❛♥ ✐♥t❡❣❡r t♦ ❛ ♣❛✐r ♦❢ ✐♥t❡❣❡rs✳ ■♥ ❛ s✐♠✐❧❛r ❢❛s❤✐♦♥✱ ❛♥ ▼▲ ❢✉♥❝t✐♦♥ ♠❛② t❛❦❡ ❛♥② ♥✉♠❜❡r ♦❢ ❛r❣✉♠❡♥ts ❛♥❞ r❡t✉r♥ ❛♥② ♥✉♠❜❡r ♦❢ r❡s✉❧ts✱ ♣♦ss✐❜❧② ♦❢ ❞✐✛❡r❡♥t t②♣❡s✳

  10. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✷ Summary of ML’s numeric types int : the integers 0 1 ~1 2 ~2 0032 . . . • constants Slide 111 + - div mod • infixes * real : the floating-point numbers 0.0 ~1.414 3.94e~7 . . . • constants + - / • infixes * Math.sqrt Math.sin Math.ln . . . • functions ❚❤❡ ✉♥❞❡r❧✐♥❡❞ s②♠❜♦❧s ✈❛❧ ❛♥❞ ❢✉♥ ❛r❡ ❦❡②✇♦r❞s ✿ t❤❡② ♠❛② ♥♦t ❜❡ ✉s❡❞ ❛s ✐❞❡♥t✐✜❡rs✳ ❍❡r❡ ✐s ❛ ❝♦♠♣❧❡t❡ ❧✐st ♦❢ ▼▲✬s ❦❡②✇♦r❞s✳ ❛❜st②♣❡ ❛♥❞ ❛♥❞❛❧s♦ ❛s ❝❛s❡ ❞❛t❛t②♣❡ ❞♦ ❡❧s❡ ❡♥❞ ❡qt②♣❡ ❡①❝❡♣t✐♦♥ ❢♥ ❢✉♥ ❢✉♥❝t♦r ❤❛♥❞❧❡ ✐❢ ✐♥ ✐♥❝❧✉❞❡ ✐♥❢✐① ✐♥❢✐①r ❧❡t ❧♦❝❛❧ ♥♦♥❢✐① ♦❢ ♦♣ ♦♣❡♥ ♦r❡❧s❡ r❛✐s❡ r❡❝ s❤❛r✐♥❣ s✐❣ s✐❣♥❛t✉r❡ str✉❝t str✉❝t✉r❡ t❤❡♥ t②♣❡ ✈❛❧ ✇❤❡r❡ ✇❤✐❧❡ ✇✐t❤ ✇✐t❤t②♣❡ ❚❤❡ ♥❡❣❛t✐♦♥ ♦❢ ① ✐s ✇r✐tt❡♥ ⑦① r❛t❤❡r t❤❛♥ ✲① ✱ ♣❧❡❛s❡ ♥♦t❡✳ ▼♦st ❧❛♥✲ ❣✉❛❣❡s ✉s❡ t❤❡ s❛♠❡ s②♠❜♦❧ ❢♦r ♠✐♥✉s ❛♥❞ s✉❜tr❛❝t✐♦♥✱ ❜✉t ▼▲ r❡❣❛r❞s ❛❧❧ ♦♣❡r❛t♦rs✱ ✇❤❡t❤❡r ✐♥✜① ♦r ♥♦t✱ ❛s ❢✉♥❝t✐♦♥s✳ ❙✉❜tr❛❝t✐♦♥ t❛❦❡s ❛ ♣❛✐r ♦❢ ♥✉♠❜❡rs✱ ❜✉t ♠✐♥✉s t❛❦❡s ❛ s✐♥❣❧❡ ♥✉♠❜❡r❀ t❤❡② ❛r❡ ❞✐st✐♥❝t ❢✉♥❝t✐♦♥s ❛♥❞ ♠✉st ❤❛✈❡ ❞✐st✐♥❝t ♥❛♠❡s✳ ❙✐♠✐❧❛r❧②✱ ✇❡ ♠❛② ♥♦t ✇r✐t❡ ✰① ✳ ❈♦♠♣✉t❡r ♥✉♠❜❡rs ❤❛✈❡ ❛ ✜♥✐t❡ r❛♥❣❡✱ ✇❤✐❝❤ ✐❢ ❡①❝❡❡❞❡❞ ❣✐✈❡s r✐s❡ t♦ ❛♥ ❖✈❡r✢♦✇ ❡rr♦r✳ ❙♦♠❡ ▼▲ s②st❡♠s ❝❛♥ r❡♣r❡s❡♥t ✐♥t❡❣❡rs ♦❢ ❛r❜✐tr❛r② s✐③❡✳ ■❢ ✐♥t❡❣❡rs ❛♥❞ r❡❛❧s ♠✉st ❜❡ ❝♦♠❜✐♥❡❞ ✐♥ ❛ ❝❛❧❝✉❧❛t✐♦♥✱ ▼▲ ♣r♦✈✐❞❡s ❢✉♥❝t✐♦♥s t♦ ❝♦♥✈❡rt ❜❡t✇❡❡♥ t❤❡♠✿ r❡❛❧ ✿ ✐♥t ✲❃ r❡❛❧ ❝♦♥✈❡rt ❛♥ ✐♥t❡❣❡r t♦ t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ r❡❛❧ ❢❧♦♦r ✿ r❡❛❧ ✲❃ ✐♥t ❝♦♥✈❡rt ❛ r❡❛❧ t♦ t❤❡ ❣r❡❛t❡st ✐♥t❡❣❡r ♥♦t ❡①❝❡❡❞✐♥❣ ✐t ▼▲✬s ❧✐❜r❛r✐❡s ❛r❡ ♦r❣❛♥✐③❡❞ ✉s✐♥❣ ♠♦❞✉❧❡s✱ s♦ ✇❡ ✉s❡ ❝♦♠♣♦✉♥❞ ✐❞❡♥t✐✲ ✜❡rs s✉❝❤ ❛s ▼❛t❤✳sqrt t♦ r❡❢❡r t♦ ❧✐❜r❛r② ❢✉♥❝t✐♦♥s✳ ■♥ ▼♦s❝♦✇ ▼▲✱ ❧✐❜r❛r② ✉♥✐ts ❛r❡ ❧♦❛❞❡❞ ❜② ❝♦♠♠❛♥❞s s✉❝❤ ❛s ❧♦❛❞✧▼❛t❤✧❀ ✳ ❚❤❡r❡ ❛r❡ t❤♦✉s❛♥❞s ♦❢ ❧✐❜r❛r② ❢✉♥❝t✐♦♥s✱ ✐♥❝❧✉❞✐♥❣ t❡①t✲♣r♦❝❡ss✐♥❣ ❛♥❞ ♦♣❡r❛t✐♥❣ s②st❡♠s ❢✉♥❝t✐♦♥s ✐♥ ❛❞❞✐t✐♦♥ t♦ t❤❡ ✉s✉❛❧ ♥✉♠❡r✐❝❛❧ ♦♥❡s✳

  11. ■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✸ ❋♦r ♠♦r❡ ❞❡t❛✐❧s ♦♥ ▼▲✬s s②♥t❛①✱ ♣❧❡❛s❡ ❝♦♥s✉❧t ❛ t❡①t❜♦♦❦✳ ▼✐♥❡ ❬✶✸❪ ❛♥❞ ❲✐❦strö♠✬s ❬✶✻❪ ♠❛② ❜❡ ❢♦✉♥❞ ✐♥ ♠❛♥② ❈♦❧❧❡❣❡ ❧✐❜r❛r✐❡s✳ ❯❧❧♠❛♥ ❬✶✺❪✱ ✐♥ t❤❡ ❈♦♠♣✉t❡r ▲❛❜ ❧✐❜r❛r②✱ ✐s ❛❧s♦ ✇♦rt❤ ❛ ❧♦♦❦✳ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✶✕✹✼✱ ❛♥❞ ❡s♣❡❝✐❛❧❧② ✶✼✕✸✷✳ ❖♥❡ s♦❧✉t✐♦♥ t♦ t❤❡ ②❡❛r ✷✵✵✵ ❜✉❣ ✐♥✈♦❧✈❡s st♦r✐♥❣ ②❡❛rs ❛s ❊①❡r❝✐s❡ ✶✳✶ t✇♦ ❞✐❣✐ts✱ ❜✉t ✐♥t❡r♣r❡t✐♥❣ t❤❡♠ s✉❝❤ t❤❛t ✺✵ ♠❡❛♥s ✶✾✺✵ ❛♥❞ ✹✾ ♠❡❛♥s ✷✵✹✾✳ ❈♦♠♠❡♥t ♦♥ t❤❡ ♠❡r✐ts ❛♥❞ ❞❡♠❡r✐ts ♦❢ t❤✐s ❛♣♣r♦❛❝❤✳ ❯s✐♥❣ t❤❡ ❞❛t❡ r❡♣r❡s❡♥t❛t✐♦♥ ♦❢ t❤❡ ♣r❡✈✐♦✉s ❡①❡r❝✐s❡✱ ❝♦❞❡ ❊①❡r❝✐s❡ ✶✳✷ ▼▲ ❢✉♥❝t✐♦♥s t♦ ✭❛✮ ❝♦♠♣❛r❡ t✇♦ ②❡❛rs ✭❜✮ ❛❞❞✴s✉❜tr❛❝t s♦♠❡ ❣✐✈❡♥ ♥✉♠❜❡r ♦❢ ②❡❛rs ❢r♦♠ ❛♥♦t❤❡r ②❡❛r✳ ✭❨♦✉ ♠❛② ♥❡❡❞ t♦ ❧♦♦❦ ❛❤❡❛❞ t♦ t❤❡ ♥❡①t ❧❡❝t✉r❡ ❢♦r ▼▲✬s ❝♦♠♣❛r✐s♦♥ ♦♣❡r❛t♦rs✳✮

  12. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✹ Raising a Number to a Power fun npower(x,n) : real = if n=0 then 1.0 Slide 201 else x * npower(x, n-1); > val npower = fn : real * int -> real Mathematical Justification (for x � = 0 ): x 0 = 1 x n +1 = x × x n . ❚❤❡ ❢✉♥❝t✐♦♥ ♥♣♦✇❡r r❛✐s❡s ✐ts r❡❛❧ ❛r❣✉♠❡♥t ① t♦ t❤❡ ♣♦✇❡r ♥ ✱ ❛ ♥♦♥✲ ♥❡❣❛t✐✈❡ ✐♥t❡❣❡r✳ ❚❤❡ ❢✉♥❝t✐♦♥ ✐s r❡❝✉rs✐✈❡ ✿ ✐t ❝❛❧❧s ✐ts❡❧❢✳ ❚❤✐s ❝♦♥❝❡♣t s❤♦✉❧❞ ❜❡ ❢❛♠✐❧✐❛r ❢r♦♠ ♠❛t❤❡♠❛t✐❝s✱ s✐♥❝❡ ❡①♣♦♥❡♥t✐❛t✐♦♥ ✐s ❞❡✜♥❡❞ ❜② t❤❡ r✉❧❡s s❤♦✇♥ ❛❜♦✈❡✳ ❚❤❡ ▼▲ ♣r♦❣r❛♠♠❡r ✉s❡s r❡❝✉rs✐♦♥ ❤❡❛✈✐❧②✳ ❋♦r n ≥ 0 ✱ t❤❡ ❡q✉❛t✐♦♥ x n +1 = x × x n ②✐❡❧❞s ❛♥ ♦❜✈✐♦✉s ❝♦♠♣✉t❛t✐♦♥✿ x 3 = x × x 2 = x × x × x 1 = x × x × x × x 0 = x × x × x. ❚❤❡ ❡q✉❛t✐♦♥ ❝❧❡❛r❧② ❤♦❧❞s ❡✈❡♥ ❢♦r ♥❡❣❛t✐✈❡ n ✳ ❍♦✇❡✈❡r✱ t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ ❝♦♠♣✉t❛t✐♦♥ r✉♥s ❢♦r❡✈❡r✿ x − 1 = x × x − 2 = x × x × x − 3 = · · · ◆♦✇ ❢♦r ❛ t✐r❡s♦♠❡ ❜✉t ♥❡❝❡ss❛r② ❛s✐❞❡✳ ■♥ ♠♦st ❧❛♥❣✉❛❣❡s✱ t❤❡ t②♣❡s ♦❢ ❛r❣✉♠❡♥ts ❛♥❞ r❡s✉❧ts ♠✉st ❛❧✇❛②s ❜❡ s♣❡❝✐✜❡❞✳ ▼▲ ✐s ✉♥✉s✉❛❧ ✐♥ ♣r♦✈✐❞✐♥❣ t②♣❡ ✐♥❢❡r❡♥❝❡ ✿ ✐t ♥♦r♠❛❧❧② ✇♦r❦s ♦✉t t❤❡ t②♣❡s ❢♦r ✐ts❡❧❢✳ ❍♦✇❡✈❡r✱ s♦♠❡t✐♠❡s ▼▲ ♥❡❡❞s ❛ ❤✐♥t❀ ❢✉♥❝t✐♦♥ ♥♣♦✇❡r ❤❛s ❛ t②♣❡ ❝♦♥str❛✐♥t t♦ s❛② ✐ts r❡s✉❧t ✐s r❡❛❧ ✳ ❙✉❝❤ ❝♦♥str❛✐♥ts ❛r❡ r❡q✉✐r❡❞ ✇❤❡♥ ♦✈❡r❧♦❛❞✐♥❣ ✇♦✉❧❞ ♦t❤❡r✇✐s❡ ♠❛❦❡ ❛ ❢✉♥❝t✐♦♥✬s t②♣❡ ❛♠❜✐❣✉♦✉s✳ ▼▲ ❝❤♦♦s❡s t②♣❡ ✐♥t ❜② ❞❡❢❛✉❧t ♦r✱ ✐♥ ❡❛r❧✐❡r ✈❡rs✐♦♥s✱ ♣r✐♥ts ❛♥ ❡rr♦r ♠❡ss❛❣❡✳ ❉❡s♣✐t❡ t❤❡ ❜❡st ❡✛♦rts ♦❢ ❧❛♥❣✉❛❣❡ ❞❡s✐❣♥❡rs✱ ❛❧❧ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❤❛✈❡ tr♦✉❜❧❡ ♣♦✐♥ts s✉❝❤ ❛s t❤❡s❡✳ ❚②♣✐❝❛❧❧②✱ t❤❡② ❛r❡ ❝♦♠♣r♦♠✐s❡s ❝❛✉s❡❞ ❜② tr②✐♥❣ t♦ ❣❡t t❤❡ ❜❡st ♦❢ ❜♦t❤ ✇♦r❧❞s✱ ❤❡r❡ t②♣❡ ✐♥❢❡r❡♥❝❡ ❛♥❞ ♦✈❡r❧♦❛❞✐♥❣✳

  13. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✺ An Aside: Overloading Functions defined for both int and real : ~ + - * • operators Slide 202 < <= > >= • relations The type checker requires help! — a type constraint fun square (x) = x * x; A MBIGUOUS fun square (x:real) = x * x; Clear ◆❡❛r❧② ❛❧❧ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ♦✈❡r❧♦❛❞ t❤❡ ❛r✐t❤♠❡t✐❝ ♦♣❡r❛t♦rs✳ ❲❡ ❞♦♥✬t ✇❛♥t t♦ ❤❛✈❡ ❞✐✛❡r❡♥t ♦♣❡r❛t♦rs ❢♦r ❡❛❝❤ t②♣❡ ♦❢ ♥✉♠❜❡r✦ ❙♦♠❡ ❧❛♥✲ ❣✉❛❣❡s ❤❛✈❡ ❥✉st ♦♥❡ t②♣❡ ♦❢ ♥✉♠❜❡r✱ ❝♦♥✈❡rt✐♥❣ ❛✉t♦♠❛t✐❝❛❧❧② ❜❡t✇❡❡♥ ❞✐❢✲ ❢❡r❡♥t ❢♦r♠❛ts❀ t❤✐s ✐s s❧♦✇ ❛♥❞ ❝♦✉❧❞ ❧❡❛❞ t♦ ✉♥❡①♣❡❝t❡❞ r♦✉♥❞✐♥❣ ❡rr♦rs✳ ❚②♣❡ ❝♦♥str❛✐♥ts ❛r❡ ❛❧❧♦✇❡❞ ❛❧♠♦st ❛♥②✇❤❡r❡✳ ❲❡ ❝❛♥ ♣✉t ♦♥❡ ♦♥ ❛♥② ♦❝❝✉rr❡♥❝❡ ♦❢ ① ✐♥ t❤❡ ❢✉♥❝t✐♦♥✳ ❲❡ ❝❛♥ ❝♦♥str❛✐♥ t❤❡ ❢✉♥❝t✐♦♥✬s r❡s✉❧t✿ ❢✉♥ sq✉❛r❡ ① ❂ ① ✯ ① ✿ r❡❛❧❀ ❢✉♥ sq✉❛r❡ ① ✿ r❡❛❧ ❂ ① ✯ ①❀ ▼▲ tr❡❛ts t❤❡ ❡q✉❛❧✐t② t❡st s♣❡❝✐❛❧❧②✳ ❊①♣r❡ss✐♦♥s ❧✐❦❡ ✐❢ ①❂② t❤❡♥ ✳✳✳ ❛r❡ ✜♥❡ ♣r♦✈✐❞❡❞ x ❛♥❞ y ❤❛✈❡ t❤❡ s❛♠❡ t②♣❡ ❛♥❞ ❡q✉❛❧✐t② t❡st✐♥❣ ✐s ♣♦ss✐❜❧❡ ❢♦r t❤❛t t②♣❡✳ ✶ ◆♦t❡ t❤❛t ① ❁❃ ② ✐s ▼▲ ❢♦r x � = y ✳ ✶ ❆❧❧ t❤❡ t②♣❡s t❤❛t ✇❡ s❤❛❧❧ s❡❡ ❢♦r s♦♠❡ t✐♠❡ ❛❞♠✐t ❡q✉❛❧✐t② t❡st✐♥❣✳ ▼♦s❝♦✇ ▼▲ ❛❧❧♦✇s ❡✈❡♥ ❡q✉❛❧✐t② t❡st✐♥❣ ♦❢ r❡❛❧s✱ ✇❤✐❝❤ ✐s ❢♦r❜✐❞❞❡♥ ✐♥ t❤❡ ❧❛t❡st ✈❡rs✐♦♥ ♦❢ t❤❡ ▼▲ ❧✐❜r❛r②✳ ❙♦♠❡ ❝♦♠♣✐❧❡rs ♠❛② ✐♥s✐st t❤❛t ②♦✉ ✇r✐t❡ ❘❡❛❧✳❂❂✭①✱②✮ ✳

  14. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✻ Conditional Expressions and Type bool if b then x else y not ( b ) negation of b Slide 203 p andalso q if p then q else false ≡ p orelse q ≡ if p then true else q A Boolean-valued function! fun even n = (n mod 2 = 0); > val even = fn : int -> bool ❆ ❝❤❛r❛❝t❡r✐st✐❝ ❢❡❛t✉r❡ ♦❢ t❤❡ ❝♦♠♣✉t❡r ✐s ✐ts ❛❜✐❧✐t② t♦ t❡st ❢♦r ❝♦♥❞✐✲ t✐♦♥s ❛♥❞ ❛❝t ❛❝❝♦r❞✐♥❣❧②✳ ■♥ t❤❡ ❡❛r❧② ❞❛②s✱ ❛ ♣r♦❣r❛♠ ♠✐❣❤t ❥✉♠♣ t♦ ❛ ❣✐✈❡♥ ❛❞❞r❡ss ❞❡♣❡♥❞✐♥❣ ♦♥ t❤❡ s✐❣♥ ♦❢ s♦♠❡ ♥✉♠❜❡r✳ ▲❛t❡r✱ ❏♦❤♥ ▼❝❈❛rt❤② ❞❡✜♥❡❞ t❤❡ ❝♦♥❞✐t✐♦♥❛❧ ❡①♣r❡ss✐♦♥ t♦ s❛t✐s❢② ( ✐❢ tr✉❡ t❤❡♥ x ❡❧s❡ y ) = x ( ✐❢ ❢❛❧s❡ t❤❡♥ x ❡❧s❡ y ) = y ▼▲ ❡✈❛❧✉❛t❡s t❤❡ ❡①♣r❡ss✐♦♥ ✐❢ B t❤❡♥ E 1 ❡❧s❡ E 2 ❜② ✜rst ❡✈❛❧✉❛t✐♥❣ B ✳ ■❢ t❤❡ r❡s✉❧t ✐s tr✉❡ t❤❡♥ ▼▲ ❡✈❛❧✉❛t❡s E 1 ❛♥❞ ♦t❤❡r✇✐s❡ E 2 ✳ ❖♥❧② ♦♥❡ ♦❢ t❤❡ t✇♦ ❡①♣r❡ss✐♦♥s E 1 ❛♥❞ E 2 ✐s ❡✈❛❧✉❛t❡❞✦ ■❢ ❜♦t❤ ✇❡r❡ ❡✈❛❧✉❛t❡❞✱ t❤❡♥ r❡❝✉rs✐✈❡ ❢✉♥❝t✐♦♥s ❧✐❦❡ ♥♣♦✇❡r ❛❜♦✈❡ ✇♦✉❧❞ r✉♥ ❢♦r❡✈❡r✳ ❚❤❡ ✐❢ ✲❡①♣r❡ss✐♦♥ ✐s ❣♦✈❡r♥❡❞ ❜② ❛♥ ❡①♣r❡ss✐♦♥ ♦❢ t②♣❡ ❜♦♦❧ ✱ ✇❤♦s❡ t✇♦ ✈❛❧✉❡s ❛r❡ tr✉❡ ❛♥❞ ❢❛❧s❡ ✳ ■♥ ♠♦❞❡r♥ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✱ t❡sts ❛r❡ ♥♦t ❜✉✐❧t ✐♥t♦ ✏❝♦♥❞✐t✐♦♥❛❧ ❜r❛♥❝❤✑ ❝♦♥str✉❝ts ❜✉t ❤❛✈❡ ❛♥ ✐♥❞❡♣❡♥❞❡♥t st❛t✉s✳ ❚❡sts✱ ♦r ❇♦♦❧❡❛♥ ❡①♣r❡ss✐♦♥s ✱ ❝❛♥ ❜❡ ❡①♣r❡ss❡❞ ✉s✐♥❣ r❡❧❛t✐♦♥❛❧ ♦♣❡r❛✲ t♦rs s✉❝❤ ❛s < ❛♥❞ = ✳ ❚❤❡② ❝❛♥ ❜❡ ❝♦♠❜✐♥❡❞ ✉s✐♥❣ t❤❡ ❇♦♦❧❡❛♥ ♦♣❡r❛t♦rs ❢♦r ♥❡❣❛t✐♦♥ ✭ ♥♦t ✮✱ ❝♦♥❥✉♥❝t✐♦♥ ✭ ❛♥❞❛❧s♦ ✮ ❛♥❞ ❞✐s❥✉♥❝t✐♦♥ ✭ ♦r❡❧s❡ ✮✳ ◆❡✇ ♣r♦♣❡rt✐❡s ❝❛♥ ❜❡ ❞❡❝❧❛r❡❞ ❛s ❢✉♥❝t✐♦♥s✱ ❡✳❣✳ t♦ t❡st ✇❤❡t❤❡r ❛♥ ✐♥t❡❣❡r ✐s ❡✈❡♥✳ ◆♦t❡✳ ❚❤❡ ❛♥❞❛❧s♦ ❛♥❞ ♦r❡❧s❡ ♦♣❡r❛t♦rs ❡✈❛❧✉❛t❡ t❤❡✐r s❡❝♦♥❞ ♦♣❡r❛♥❞ ♦♥❧② ✐❢ ♥❡❝❡ss❛r②✳ ❚❤❡② ❝❛♥♥♦t ❜❡ ❞❡✜♥❡❞ ❛s ❢✉♥❝t✐♦♥s✿ ▼▲ ❢✉♥❝t✐♦♥s ❡✈❛❧✉✲ ❛t❡ ❛❧❧ t❤❡✐r ❛r❣✉♠❡♥ts✳ ✭■♥ ▼▲✱ ❛♥② t✇♦✲❛r❣✉♠❡♥t ❢✉♥❝t✐♦♥ ❝❛♥ ❜❡ t✉r♥❡❞ ✐♥t♦ ❛♥ ✐♥✜① ♦♣❡r❛t♦r✳✮

  15. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✼ Raising a Number to a Power, Revisited fun power(x,n) : real = if n=1 then x else if even n then power(x*x, n div 2) else x * power(x*x, n div 2) Slide 204 Mathematical Justification : x 1 = x x 2 n = ( x 2 ) n x 2 n +1 = x × ( x 2 ) n . ❋♦r ❧❛r❣❡ n ✱ ❝♦♠♣✉t✐♥❣ ♣♦✇❡rs ✉s✐♥❣ x n +1 = x × x n ✐s t♦♦ s❧♦✇ t♦ ❜❡ ♣r❛❝t✐❝❛❧✳ ❚❤❡ ❡q✉❛t✐♦♥s ❛❜♦✈❡ ❛r❡ ♠✉❝❤ ❢❛st❡r✿ 2 12 = 4 6 = 16 3 = 16 × 256 1 = 16 × 256 = 4096 . ■♥st❡❛❞ ♦❢ n ♠✉❧t✐♣❧✐❝❛t✐♦♥s✱ ✇❡ ♥❡❡❞ ❛t ♠♦st 2 lg n ♠✉❧t✐♣❧✐❝❛t✐♦♥s✱ ✇❤❡r❡ lg n ✐s t❤❡ ❧♦❣❛r✐t❤♠ ♦❢ n t♦ t❤❡ ❜❛s❡ ✷✳ ❲❡ ✉s❡ t❤❡ ❢✉♥❝t✐♦♥ ❡✈❡♥ ✱ ❞❡❝❧❛r❡❞ ♣r❡✈✐♦✉s❧②✱ t♦ t❡st ✇❤❡t❤❡r t❤❡ ❡①♣♦✲ ♥❡♥t ✐s ❡✈❡♥✳ ■♥t❡❣❡r ❞✐✈✐s✐♦♥ ✭ ❞✐✈ ✮ tr✉♥❝❛t❡s ✐ts r❡s✉❧t t♦ ❛♥ ✐♥t❡❣❡r✿ ❞✐✈✐❞✐♥❣ 2 n + 1 ❜② ✷ ②✐❡❧❞s n ✳ ❆ r❡❝✉rr❡♥❝❡ ✐s ❛ ✉s❡❢✉❧ ❝♦♠♣✉t❛t✐♦♥ r✉❧❡ ♦♥❧② ✐❢ ✐t ✐s ❜♦✉♥❞ t♦ t❡r♠✐♥❛t❡✳ ■❢ n > 0 t❤❡♥ n ✐s s♠❛❧❧❡r t❤❛♥ ❜♦t❤ 2 n ❛♥❞ 2 n + 1 ✳ ❆❢t❡r ❡♥♦✉❣❤ r❡❝✉rs✐✈❡ ❝❛❧❧s✱ t❤❡ ❡①♣♦♥❡♥t ✇✐❧❧ ❜❡ r❡❞✉❝❡❞ t♦ ✶✳ ❚❤❡ ❡q✉❛t✐♦♥s ❛❧s♦ ❤♦❧❞ ✐❢ n ≤ 0 ✱ ❜✉t t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ ❝♦♠♣✉t❛t✐♦♥ r✉♥s ❢♦r❡✈❡r✳ ❖✉r r❡❛s♦♥✐♥❣ ❛ss✉♠❡s ❛r✐t❤♠❡t✐❝ t♦ ❜❡ ❡①❛❝t ❀ ❢♦rt✉♥❛t❡❧②✱ t❤❡ ❝❛❧❝✉❧❛t✐♦♥ ✐s ✇❡❧❧✲❜❡❤❛✈❡❞ ✉s✐♥❣ ✢♦❛t✐♥❣✲♣♦✐♥t✳

  16. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✽ Expression Evaluation E 0 ⇒ E 1 ⇒ · · · ⇒ E n ⇒ v Sample evaluation for power : Slide 205 power (2 , 12) ⇒ power (4 , 6) ⇒ power (16 , 3) ⇒ 16 × power (256 , 1) ⇒ 16 × 256 ⇒ 4096 . ❙t❛rt✐♥❣ ✇✐t❤ E 0 ✱ t❤❡ ❡①♣r❡ss✐♦♥ E i ✐s r❡❞✉❝❡❞ t♦ E i +1 ✉♥t✐❧ t❤✐s ♣r♦❝❡ss ❝♦♥❝❧✉❞❡s ✇✐t❤ ❛ ✈❛❧✉❡ v ✳ ❆ ✈❛❧✉❡ ✐s s♦♠❡t❤✐♥❣ ❧✐❦❡ ❛ ♥✉♠❜❡r t❤❛t ❝❛♥♥♦t ❜❡ ❢✉rt❤❡r r❡❞✉❝❡❞✳ ❲❡ ✇r✐t❡ E ⇒ E ′ t♦ s❛② t❤❛t E ✐s r❡❞✉❝❡❞ t♦ E ′ ✳ ▼❛t❤❡♠❛t✐❝❛❧❧②✱ t❤❡② ❛r❡ ❡q✉❛❧✿ E = E ′ ✱ ❜✉t t❤❡ ❝♦♠♣✉t❛t✐♦♥ ❣♦❡s ❢r♦♠ E t♦ E ′ ❛♥❞ ♥❡✈❡r t❤❡ ♦t❤❡r ✇❛② ❛r♦✉♥❞✳ ❊✈❛❧✉❛t✐♦♥ ❝♦♥❝❡r♥s ♦♥❧② ❡①♣r❡ss✐♦♥s ❛♥❞ t❤❡ ✈❛❧✉❡s t❤❡② r❡t✉r♥✳ ❚❤✐s ✈✐❡✇ ♦❢ ❝♦♠♣✉t❛t✐♦♥ ♠❛② s❡❡♠ t♦ ❜❡ t♦♦ ♥❛rr♦✇✳ ■t ✐s ❝❡rt❛✐♥❧② ❢❛r r❡♠♦✈❡❞ ❢r♦♠ ❝♦♠♣✉t❡r ❤❛r❞✇❛r❡✱ ❜✉t t❤❛t ❝❛♥ ❜❡ s❡❡♥ ❛s ❛♥ ❛❞✈❛♥t❛❣❡✳ ❋♦r t❤❡ tr❛❞✐t✐♦♥❛❧ ❝♦♥❝❡♣t ♦❢ ❝♦♠♣✉t✐♥❣ s♦❧✉t✐♦♥s t♦ ♣r♦❜❧❡♠s✱ ❡①♣r❡ss✐♦♥ ❡✈❛❧✉❛t✐♦♥ ✐s ❡♥t✐r❡❧② ❛❞❡q✉❛t❡✳ ❈♦♠♣✉t❡rs ❛❧s♦ ✐♥t❡r❛❝t ✇✐t❤ t❤❡ ♦✉ts✐❞❡ ✇♦r❧❞✳ ❋♦r ❛ st❛rt✱ t❤❡② ♥❡❡❞ s♦♠❡ ♠❡❛♥s ♦❢ ❛❝❝❡♣t✐♥❣ ♣r♦❜❧❡♠s ❛♥❞ ❞❡❧✐✈❡r✐♥❣ s♦❧✉t✐♦♥s✳ ▼❛♥② ❝♦♠♣✉t❡r s②st❡♠s ♠♦♥✐t♦r ❛♥❞ ❝♦♥tr♦❧ ✐♥❞✉str✐❛❧ ♣r♦❝❡ss❡s✳ ❚❤✐s r♦❧❡ ♦❢ ❝♦♠♣✉t❡rs ✐s ❢❛♠✐❧✐❛r ♥♦✇✱ ❜✉t ✇❛s ♥❡✈❡r ❡♥✈✐s❛❣❡❞ ❛t ✜rst✳ ▼♦❞❡❧❧✐♥❣ ✐t r❡q✉✐r❡s ❛ ♥♦t✐♦♥ ♦❢ st❛t❡s t❤❛t ❝❛♥ ❜❡ ♦❜s❡r✈❡❞ ❛♥❞ ❝❤❛♥❣❡❞✳ ❚❤❡♥ ✇❡ ❝❛♥ ❝♦♥s✐❞❡r ✉♣❞❛t✐♥❣ t❤❡ st❛t❡ ❜② ❛ss✐❣♥✐♥❣ t♦ ✈❛r✐❛❜❧❡s ♦r ♣❡r❢♦r♠✐♥❣ ✐♥♣✉t✴♦✉t♣✉t✱ ✜♥❛❧❧② ❛rr✐✈✐♥❣ ❛t ❝♦♥✈❡♥t✐♦♥❛❧ ♣r♦❣r❛♠s ✭❢❛♠✐❧✐❛r t♦ t❤♦s❡ ♦❢ ②♦✉ ✇❤♦ ❦♥♦✇ ❈✱ ❢♦r ✐♥st❛♥❝❡✮ t❤❛t ❝♦♥s✐st ♦❢ ❝♦♠♠❛♥❞s✳ ❋♦r ♥♦✇✱ ✇❡ r❡♠❛✐♥ ❛t t❤❡ ❧❡✈❡❧ ♦❢ ❡①♣r❡ss✐♦♥s✱ ✇❤✐❝❤ ✐s ✉s✉❛❧❧② t❡r♠❡❞ ❢✉♥❝t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ✳

  17. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✾ Example: Summing the First n Integers fun nsum n = if n=0 then 0 else n + nsum (n-1); Slide 206 > val nsum = fn: int -> int nsum 3 ⇒ 3 + nsum 2 ⇒ 3 + (2 + nsum 1) ⇒ 3 + (2 + (1 + nsum 0)) ⇒ 3 + (2 + (1 + 0)) ⇒ . . . ⇒ 6 ❚❤❡ ❢✉♥❝t✐♦♥ ❝❛❧❧ nsum n ❝♦♠♣✉t❡s t❤❡ s✉♠ 1 + · · · + n r❛t❤❡r ♥❛ï✈❡❧②✱ ❤❡♥❝❡ t❤❡ ✐♥✐t✐❛❧ ♥ ✐♥ ✐ts ♥❛♠❡✳ ❚❤❡ ♥❡st✐♥❣ ♦❢ ♣❛r❡♥t❤❡s❡s ✐s ♥♦t ❥✉st ❛♥ ❛rt✐❢❛❝t ♦❢ ♦✉r ♥♦t❛t✐♦♥❀ ✐t ✐♥❞✐❝❛t❡s ❛ r❡❛❧ ♣r♦❜❧❡♠✳ ❚❤❡ ❢✉♥❝t✐♦♥ ❣❛t❤❡rs ✉♣ ❛ ❝♦❧❧❡❝t✐♦♥ ♦❢ ♥✉♠❜❡rs✱ ❜✉t ♥♦♥❡ ♦❢ t❤❡ ❛❞❞✐t✐♦♥s ❝❛♥ ❜❡ ♣❡r❢♦r♠❡❞ ✉♥t✐❧ nsum 0 ✐s r❡❛❝❤❡❞✳ ▼❡❛♥✇❤✐❧❡✱ t❤❡ ❝♦♠♣✉t❡r ♠✉st st♦r❡ t❤❡ ♥✉♠❜❡rs ✐♥ ❛♥ ✐♥t❡r♥❛❧ ❞❛t❛ str✉❝t✉r❡✱ t②♣✐❝❛❧❧② t❤❡ st❛❝❦ ✳ ❋♦r ❧❛r❣❡ n ✱ s❛② nsum 10000 ✱ t❤❡ ❝♦♠♣✉t❛t✐♦♥ ♠✐❣❤t ❢❛✐❧ ❞✉❡ t♦ st❛❝❦ ♦✈❡r✢♦✇✳ ❲❡ ❛❧❧ ❦♥♦✇ t❤❛t t❤❡ ❛❞❞✐t✐♦♥s ❝❛♥ ❜❡ ♣❡r❢♦r♠❡❞ ❛s ✇❡ ❣♦ ❛❧♦♥❣✳ ❍♦✇ ❞♦ ✇❡ ♠❛❦❡ t❤❡ ❝♦♠♣✉t❡r ❞♦ t❤❛t❄

  18. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✵ Iteratively Summing the First n Integers fun summing (n,total) = if n=0 then total else summing (n-1, n + total); Slide 207 > val summing = fn : int * int -> int summing (3 , 0) ⇒ summing (2 , 3) ⇒ summing (1 , 5) ⇒ summing (0 , 6) ⇒ 6 ❋✉♥❝t✐♦♥ s✉♠♠✐♥❣ t❛❦❡s ❛♥ ❛❞❞✐t✐♦♥❛❧ ❛r❣✉♠❡♥t✿ ❛ r✉♥♥✐♥❣ t♦t❛❧✳ ■❢ n ✐s ③❡r♦ t❤❡♥ ✐t r❡t✉r♥s t❤❡ r✉♥♥✐♥❣ t♦t❛❧❀ ♦t❤❡r✇✐s❡✱ s✉♠♠✐♥❣ ❛❞❞s t♦ ✐t ❛♥❞ ❝♦♥t✐♥✉❡s✳ ❚❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧s ❞♦ ♥♦t ♥❡st❀ t❤❡ ❛❞❞✐t✐♦♥s ❛r❡ ❞♦♥❡ ✐♠♠❡❞✐✲ ❛t❡❧②✳ ❆ r❡❝✉rs✐✈❡ ❢✉♥❝t✐♦♥ ✇❤♦s❡ ❝♦♠♣✉t❛t✐♦♥ ❞♦❡s ♥♦t ♥❡st ✐s ❝❛❧❧❡❞ ✐t❡r❛t✐✈❡ ♦r t❛✐❧✲r❡❝✉rs✐✈❡ ✳ ▼❛♥② ❢✉♥❝t✐♦♥s ❝❛♥ ❜❡ ♠❛❞❡ ✐t❡r❛t✐✈❡ ❜② ✐♥tr♦❞✉❝✐♥❣ ❛♥ ❛r❣✉♠❡♥t ❛♥❛❧♦❣♦✉s t♦ t♦t❛❧ ✱ ✇❤✐❝❤ ✐s ♦❢t❡♥ ❝❛❧❧❡❞ ❛♥ ❛❝❝✉♠✉❧❛t♦r ✳ ❚❤❡ ❣❛✐♥ ✐♥ ❡✣❝✐❡♥❝② ✐s s♦♠❡t✐♠❡s ✇♦rt❤✇❤✐❧❡ ❛♥❞ s♦♠❡t✐♠❡s ♥♦t✳ ❚❤❡ ❢✉♥❝t✐♦♥ ♣♦✇❡r ✐s ♥♦t ✐t❡r❛t✐✈❡ ❜❡❝❛✉s❡ ♥❡st✐♥❣ ♦❝❝✉rs ✇❤❡♥❡✈❡r t❤❡ ❡①♣♦♥❡♥t ✐s ♦❞❞✳ ❆❞❞✐♥❣ ❛ t❤✐r❞ ❛r❣✉♠❡♥t ♠❛❦❡s ✐t ✐t❡r❛t✐✈❡✱ ❜✉t t❤❡ ❝❤❛♥❣❡ ❝♦♠♣❧✐✲ ❝❛t❡s t❤❡ ❢✉♥❝t✐♦♥ ❛♥❞ t❤❡ ❣❛✐♥ ✐♥ ❡✣❝✐❡♥❝② ✐s ♠✐♥✉t❡❀ ❢♦r ✸✷✲❜✐t ✐♥t❡❣❡rs✱ t❤❡ ♠❛①✐♠✉♠ ♣♦ss✐❜❧❡ ♥❡st✐♥❣ ✐s ✸✵ ❢♦r t❤❡ ❡①♣♦♥❡♥t 2 31 − 1 ✳

  19. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✶ Recursion Versus Iteration: Some Comments Iterative normally refers to a loop —coded using while , for instance. Tail-recursion is efficient only if the compiler detects it. Slide 208 Mainly it saves space , though iterative code can run faster. D ON ’ T make programs iterative unless the gain is significant. • People fought to give recursion to programmers: first, in Algol-60 . • Your code may turn into a mess! ❆ ❝❧❛ss✐❝ ❜♦♦❦ ❜② ❆❜❡❧s♦♥ ❛♥❞ ❙✉ss♠❛♥ ❬✶❪ ✉s❡❞ ✐t❡r❛t✐✈❡ t♦ ♠❡❛♥ t❛✐❧✲ r❡❝✉rs✐✈❡ ✳ ■t ❞❡s❝r✐❜❡s t❤❡ ▲✐s♣ ❞✐❛❧❡❝t ❦♥♦✇♥ ❛s ❙❝❤❡♠❡✳ ■t❡r❛t✐✈❡ ❢✉♥❝t✐♦♥s ♣r♦❞✉❝❡ ❝♦♠♣✉t❛t✐♦♥s r❡s❡♠❜❧✐♥❣ t❤♦s❡ t❤❛t ❝❛♥ ❜❡ ❞♦♥❡ ✉s✐♥❣ ✇❤✐❧❡ ✲❧♦♦♣s ✐♥ ❝♦♥✈❡♥t✐♦♥❛❧ ❧❛♥❣✉❛❣❡s✳ ▼❛♥② ❛❧❣♦r✐t❤♠s ❝❛♥ ❜❡ ❡①♣r❡ss❡❞ ♥❛t✉r❛❧❧② ✉s✐♥❣ r❡❝✉rs✐♦♥✱ ❜✉t ♦♥❧② ❛✇❦✇❛r❞❧② ✉s✐♥❣ ✐t❡r❛t✐♦♥✳ ❚❤❡r❡ ✐s ❛ st♦r② t❤❛t ❉✐❥❦str❛ s♥❡❛❦❡❞ r❡❝✉rs✐♦♥ ✐♥t♦ ❆❧❣♦❧✲✻✵ ❜② ✐♥s❡rt✐♥❣ t❤❡ ✇♦r❞s ✏❛♥② ♦t❤❡r ♦❝❝✉rr❡♥❝❡ ♦❢ t❤❡ ♣r♦❝❡❞✉r❡ ♥❛♠❡ ❞❡♥♦t❡s ❡①❡❝✉t✐♦♥ ♦❢ t❤❡ ♣r♦❝❡❞✉r❡✑✳ ❇② ♥♦t ✉s✐♥❣ t❤❡ ✇♦r❞ ✏r❡❝✉rs✐♦♥✑✱ ❤❡ ♠❛♥❛❣❡❞ t♦ s❧✐♣ t❤✐s ❛♠❡♥❞♠❡♥t ♣❛st s❝❡♣t✐❝❛❧ ❝♦❧❧❡❛❣✉❡s✳ ❖❜s❡ss✐♦♥ ✇✐t❤ t❛✐❧ r❡❝✉rs✐♦♥ ❧❡❛❞s t♦ ❛ ❝♦❞✐♥❣ st②❧❡ ✐♥ ✇❤✐❝❤ ❢✉♥❝t✐♦♥s ❤❛✈❡ ♠❛♥② ♠♦r❡ ❛r❣✉♠❡♥ts t❤❛♥ ♥❡❝❡ss❛r②✳ ❲r✐t❡ str❛✐❣❤t❢♦r✇❛r❞ ❝♦❞❡ ✜rst✱ ❛✈♦✐❞✐♥❣ ♦♥❧② ❣r♦ss ✐♥❡✣❝✐❡♥❝②✳ ■❢ t❤❡ ♣r♦❣r❛♠ t✉r♥s ♦✉t t♦ ❜❡ t♦♦ s❧♦✇✱ t♦♦❧s ❛r❡ ❛✈❛✐❧❛❜❧❡ ❢♦r ♣✐♥♣♦✐♥t✐♥❣ t❤❡ ❝❛✉s❡✳ ❆❧✇❛②s r❡♠❡♠❜❡r ❑■❙❙ ✭❑❡❡♣ ■t ❙✐♠♣❧❡✱ ❙t✉♣✐❞✮✳ ■ ❤♦♣❡ ②♦✉ ❤❛✈❡ ❛❧❧ ♥♦t✐❝❡❞ ❜② ♥♦✇ t❤❛t t❤❡ s✉♠♠❛t✐♦♥ ❝❛♥ ❜❡ ❞♦♥❡ ❡✈❡♥ ♠♦r❡ ❡✣❝✐❡♥t❧② ✉s✐♥❣ t❤❡ ❛r✐t❤♠❡t✐❝ ♣r♦❣r❡ss✐♦♥ ❢♦r♠✉❧❛ 1 + · · · + n = n ( n + 1) / 2 .

  20. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✷ Computing Square Roots: Newton-Raphson x i +1 = a/x i + x i 2 fun nextApprox (a,x) = (a/x + x) / 2.0; Slide 209 > nextApprox = fn : real * real -> real nextApprox (2.0, 1.5); > val it = 1.41666666667 : real nextApprox (2.0, it); > val it = 1.41421568627 : real nextApprox (2.0, it); > val it = 1.41421356237 : real ◆♦✇✱ ❧❡t ✉s ❧♦♦❦ ❛t ❛ ❞✐✛❡r❡♥t s♦rt ♦❢ ❛❧❣♦r✐t❤♠✳ ❚❤❡ ◆❡✇t♦♥✲❘❛♣❤s♦♥ ♠❡t❤♦❞ ✐s ❛ ❤✐❣❤❧② ❡✛❡❝t✐✈❡ ♠❡❛♥s ♦❢ ✜♥❞✐♥❣ r♦♦ts ♦❢ ❡q✉❛t✐♦♥s✳ ■t ✐s ✉s❡❞ ✐♥ ♥✉♠❡r✐❝❛❧ ❧✐❜r❛r✐❡s t♦ ❝♦♠♣✉t❡ ♠❛♥② st❛♥❞❛r❞ ❢✉♥❝t✐♦♥s✱ ❛♥❞ ✐♥ ❤❛r❞✇❛r❡✱ t♦ ❝♦♠♣✉t❡ r❡❝✐♣r♦❝❛❧s✳ ❙t❛rt✐♥❣ ✇✐t❤ ❛♥ ❛♣♣r♦①✐♠❛t✐♦♥ x 0 ✱ ❝♦♠♣✉t❡ ♥❡✇ ♦♥❡s x 1 ✱ x 2 ✱ ✳ ✳ ✳ ✱ ✉s✐♥❣ ❛ ❢♦r♠✉❧❛ ♦❜t❛✐♥❡❞ ❢r♦♠ t❤❡ ❡q✉❛t✐♦♥ t♦ ❜❡ s♦❧✈❡❞✳ Pr♦✈✐❞❡❞ t❤❡ ✐♥✐t✐❛❧ ❣✉❡ss ✐s s✉✣❝✐❡♥t❧② ❝❧♦s❡ t♦ t❤❡ r♦♦t✱ t❤❡ ♥❡✇ ❛♣♣r♦①✐♠❛t✐♦♥s ✇✐❧❧ ❝♦♥✈❡r❣❡ t♦ ✐t r❛♣✐❞❧②✳ ❚❤❡ ❢♦r♠✉❧❛ s❤♦✇♥ ❛❜♦✈❡ ❝♦♠♣✉t❡s t❤❡ sq✉❛r❡ r♦♦t ♦❢ a ✳ ❚❤❡ ▼▲ s❡ss✐♦♥ √ ❞❡♠♦♥str❛t❡s t❤❡ ❝♦♠♣✉t❛t✐♦♥ ♦❢ 2 ✳ ❙t❛rt✐♥❣ ✇✐t❤ t❤❡ ❣✉❡ss x 0 = 1 . 5 ✱ ✇❡ r❡❛❝❤ ❜② x 3 t❤❡ sq✉❛r❡ r♦♦t ✐♥ ❢✉❧❧ ♠❛❝❤✐♥❡ ♣r❡❝✐s✐♦♥✳ ❈♦♥t✐♥✉✐♥❣ t❤❡ s❡ss✐♦♥ ❛ ❜✐t ❧♦♥❣❡r r❡✈❡❛❧s t❤❛t t❤❡ ❝♦♥✈❡r❣❡♥❝❡ ❤❛s ♦❝❝✉rr❡❞✱ ✇✐t❤ x 4 = x 3 ✿ ♥❡①t❆♣♣r♦① ✭✷✳✵✱ ✐t✮❀ ❃ ✈❛❧ ✐t ❂ ✶✳✹✶✹✷✶✸✺✻✷✸✼ ✿ r❡❛❧ ✐t✯✐t❀ ❃ ✈❛❧ ✐t ❂ ✷✳✵ ✿ r❡❛❧

  21. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✸ A Square Root Function fun findRoot (a, x, epsilon) = let val nextx = (a/x + x) / 2.0 in if abs(x-nextx) < epsilon*x then nextx Slide 210 else findRoot (a, nextx, epsilon) end; fun sqrt a = findRoot (a, 1.0, 1.0E~10); > sqrt = fn : real -> real sqrt 64.0; > val it = 8.0 : real ❚❤❡ ❢✉♥❝t✐♦♥ ❢✐♥❞❘♦♦t ❛♣♣❧✐❡s ◆❡✇t♦♥✲❘❛♣❤s♦♥ t♦ ❝♦♠♣✉t❡ t❤❡ sq✉❛r❡ r♦♦t ♦❢ a ✱ st❛rt✐♥❣ ✇✐t❤ t❤❡ ✐♥✐t✐❛❧ ❣✉❡ss x ✱ ✇✐t❤ r❡❧❛t✐✈❡ ❛❝❝✉r❛❝② ǫ ✳ ■t t❡r♠✐♥❛t❡s ✇❤❡♥ s✉❝❝❡ss✐✈❡ ❛♣♣r♦①✐♠❛t✐♦♥s ❛r❡ ✇✐t❤✐♥ t❤❡ t♦❧❡r❛♥❝❡ ǫx ✱ ♠♦r❡ ♣r❡❝✐s❡❧②✱ ✇❤❡♥ | x i − x i +1 | < ǫx ✳ ❚❤✐s r❡❝✉rs✐✈❡ ❢✉♥❝t✐♦♥ ❞✐✛❡rs ❢✉♥❞❛♠❡♥t❛❧❧② ❢r♦♠ ♣r❡✈✐♦✉s ♦♥❡s ❧✐❦❡ ♣♦✇❡r ❛♥❞ s✉♠♠✐♥❣ ✳ ❋♦r t❤♦s❡✱ ✇❡ ❝❛♥ ❡❛s✐❧② ♣✉t ❛ ❜♦✉♥❞ ♦♥ t❤❡ ♥✉♠❜❡r ♦❢ st❡♣s t❤❡② ✇✐❧❧ t❛❦❡✱ ❛♥❞ t❤❡✐r r❡s✉❧t ✐s ❡①❛❝t✳ ❋♦r ❢✐♥❞❘♦♦t ✱ ❞❡t❡r♠✐♥✲ ✐♥❣ ❤♦✇ ♠❛♥② st❡♣s ❛r❡ r❡q✉✐r❡❞ ❢♦r ❝♦♥✈❡r❣❡♥❝❡ ✐s ❤❛r❞✳ ■t ♠✐❣❤t ♦s❝✐❧❧❛t❡ ❜❡t✇❡❡♥ t✇♦ ❛♣♣r♦①✐♠❛t✐♦♥s t❤❛t ❞✐✛❡r ✐♥ t❤❡✐r ❧❛st ❜✐t✳ ❖❜s❡r✈❡ ❤♦✇ ♥❡①t① ✐s ❞❡❝❧❛r❡❞ ❛s t❤❡ ♥❡①t ❛♣♣r♦①✐♠❛t✐♦♥✳ ❚❤✐s ✈❛❧✉❡ ✐s ✉s❡❞ t❤r❡❡ t✐♠❡s ❜✉t ❝♦♠♣✉t❡❞ ♦♥❧② ♦♥❝❡✳ ■♥ ❣❡♥❡r❛❧✱ ❧❡t D ✐♥ E ❡♥❞ ❞❡❝❧❛r❡s t❤❡ ✐t❡♠s ✐♥ D ❜✉t ♠❛❦❡s t❤❡♠ ✈✐s✐❜❧❡ ♦♥❧② ✐♥ t❤❡ ❡①♣r❡ss✐♦♥ E ✳ ✭❘❡❝❛❧❧ t❤❛t ✐❞❡♥t✐✜❡rs ❞❡❝❧❛r❡❞ ✉s✐♥❣ ✈❛❧ ❝❛♥♥♦t ❜❡ ❛ss✐❣♥❡❞ t♦✳✮ ❋✉♥❝t✐♦♥ sqrt ♠❛❦❡s ❛♥ ✐♥✐t✐❛❧ ❣✉❡ss ♦❢ ✶✳✵✳ ❆ ♣r❛❝t✐❝❛❧ ❛♣♣❧✐❝❛t✐♦♥ ♦❢ ◆❡✇t♦♥✲❘❛♣❤s♦♥ ❣❡ts t❤❡ ✐♥✐t✐❛❧ ❛♣♣r♦①✐♠❛t✐♦♥ ❢r♦♠ ❛ t❛❜❧❡✳ ■♥❞❡①❡❞ ❜② s❛② ❡✐❣❤t ❜✐ts t❛❦❡♥ ❢r♦♠ a ✱ t❤❡ t❛❜❧❡ ✇♦✉❧❞ ❤❛✈❡ ♦♥❧② ✷✺✻ ❡♥tr✐❡s✳ ❆ ❣♦♦❞ ✐♥✐t✐❛❧ ❣✉❡ss ❡♥s✉r❡s ❝♦♥✈❡r❣❡♥❝❡ ✇✐t❤✐♥ ❛ ♣r❡❞❡t❡r♠✐♥❡❞ ♥✉♠❜❡r ♦❢ st❡♣s✱ t②♣✐❝❛❧❧② t✇♦ ♦r t❤r❡❡✳ ❚❤❡ ❧♦♦♣ ❜❡❝♦♠❡s str❛✐❣❤t✲❧✐♥❡ ❝♦❞❡ ✇✐t❤ ♥♦ ❝♦♥✈❡r❣❡♥❝❡ t❡st✳

  22. ■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✹ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✹✽✕✺✽✳ ❚❤❡ ♠❛t❡r✐❛❧ ♦♥ t②♣❡ ❝❤❡❝❦✐♥❣ ✭♣❛❣❡s ✻✸✕✻✼✮ ♠❛② ✐♥t❡r❡st t❤❡ ♠♦r❡ ❡♥t❤✉s✐❛st✐❝ st✉❞❡♥t✳ ❈♦❞❡ ❛♥ ✐t❡r❛t✐✈❡ ✈❡rs✐♦♥ ♦❢ t❤❡ ❢✉♥❝t✐♦♥ ♣♦✇❡r ✳ ❊①❡r❝✐s❡ ✷✳✶ ❚r② ✉s✐♥❣ x i +1 = x i (2 − x i a ) t♦ ❝♦♠♣✉t❡ 1 /a ✳ ❯♥❧❡ss t❤❡ ❊①❡r❝✐s❡ ✷✳✷ ✐♥✐t✐❛❧ ❛♣♣r♦①✐♠❛t✐♦♥ x 0 ✐s ❣♦♦❞✱ ✐t ♠✐❣❤t ♥♦t ❝♦♥✈❡r❣❡ ❛t ❛❧❧✳ ✭P✐❡rr❡ ❏♦✉❡t ❛♥❞ ❙t❡❢❛♥ ❘❡♥♦❧❞ ♥♦t❡ t❤❛t ✐❢ a > 0 t❤❡♥ t❤❡ s❡q✉❡♥❝❡ ❝♦♥✈❡r❣❡s ✐❢ ❛♥❞ ♦♥❧② ✐❢ 0 < x 0 < 2 /a ✳✮ ❋✉♥❝t✐♦♥s ♥♣♦✇❡r ❛♥❞ ♣♦✇❡r ❜♦t❤ ❤❛✈❡ t②♣❡ ❝♦♥str❛✐♥ts✱ ❊①❡r❝✐s❡ ✷✳✸ ❜✉t ♦♥❧② ♦♥❡ ♦❢ t❤❡♠ ❛❝t✉❛❧❧② ♥❡❡❞s ✐t✳ ❚r② t♦ ✇♦r❦ ♦✉t ✇❤✐❝❤ ❢✉♥❝t✐♦♥ ❞♦❡s ♥♦t ♥❡❡❞s ✐ts t②♣❡ ❝♦♥str❛✐♥t ♠❡r❡❧② ❜② ❧♦♦❦✐♥❣ ❛t ✐ts ❞❡❝❧❛r❛t✐♦♥✳

  23. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✺ A Silly Square Root Function fun nthApprox (a,x,n) = if n=0 then x Slide 301 else (a / nthApprox(a,x,n-1) + nthApprox(a,x,n-1)) / 2.0; The function calls itself 2 n times! Bigger inputs mean higher costs—but what’s the growth rate? ❚❤❡ ♣✉r♣♦s❡ ♦❢ ♥t❤❆♣♣r♦① ✐s t♦ ❝♦♠♣✉t❡ x n ❢r♦♠ t❤❡ ✐♥✐t✐❛❧ ❛♣♣r♦①✐♠❛✲ t✐♦♥ x 0 ✉s✐♥❣ t❤❡ ◆❡✇t♦♥✲❘❛♣❤s♦♥ ❢♦r♠✉❧❛ x i +1 = ( a/x i + x i ) / 2 ✳ ❘❡♣❡❛t✐♥❣ t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧✖❛♥❞ t❤❡r❡❢♦r❡ t❤❡ ❝♦♠♣✉t❛t✐♦♥✖✐s ♦❜✈✐♦✉s❧② ✇❛st❡❢✉❧✳ ❚❤❡ r❡♣❡t✐t✐♦♥ ❝❛♥ ❜❡ ❡❧✐♠✐♥❛t❡❞ ✉s✐♥❣ ❧❡t ✈❛❧✳✳✳✐♥ E ❡♥❞ ✳ ❇❡tt❡r st✐❧❧ ✐s t♦ ❝❛❧❧ t❤❡ ❢✉♥❝t✐♦♥ ♥❡①t❆♣♣r♦① ✱ ✉t✐❧✐③✐♥❣ ❛♥ ❡①✐st✐♥❣ ❛❜str❛❝t✐♦♥✳ ❋❛st ❤❛r❞✇❛r❡ ❞♦❡s ♥♦t ♠❛❦❡ ❣♦♦❞ ❛❧❣♦r✐t❤♠s ✉♥♥❡❝❡ss❛r②✳ ❖♥ t❤❡ ❝♦♥✲ tr❛r②✱ ❢❛st❡r ❤❛r❞✇❛r❡ ♠❛❣♥✐✜❡s t❤❡ s✉♣❡r✐♦r✐t② ♦❢ ❜❡tt❡r ❛❧❣♦r✐t❤♠s✳ ❚②♣✲ ✐❝❛❧❧②✱ ✇❡ ✇❛♥t t♦ ❤❛♥❞❧❡ t❤❡ ❧❛r❣❡st ✐♥♣✉ts ♣♦ss✐❜❧❡✳ ■❢ ✇❡ ❜✉② ❛ ♠❛❝❤✐♥❡ t❤❛t ✐s t✇✐❝❡ ❛s ♣♦✇❡r❢✉❧ ❛s ♦✉r ♦❧❞ ♦♥❡✱ ❤♦✇ ♠✉❝❤ ❝❛♥ t❤❡ ✐♥♣✉t t♦ ♦✉r ❢✉♥❝t✐♦♥ ❜❡ ✐♥❝r❡❛s❡❞❄ ❲✐t❤ ♥t❤❆♣♣r♦① ✱ ✇❡ ❝❛♥ ♦♥❧② ❣♦ ❢r♦♠ n t♦ n + 1 ✳ ❲❡ ❛r❡ ❧✐♠✐t❡❞ t♦ t❤✐s ♠♦❞❡st ✐♥❝r❡❛s❡ ❜❡❝❛✉s❡ t❤❡ ❢✉♥❝t✐♦♥✬s r✉♥♥✐♥❣ t✐♠❡ ✐s ♣r♦♣♦rt✐♦♥❛❧ t♦ 2 n ✳ ❲✐t❤ t❤❡ ❢✉♥❝t✐♦♥ ♥♣♦✇❡r ✱ ❞❡✜♥❡❞ ✐♥ ▲❡❝t✳ ✷✱ ✇❡ ❝❛♥ ❣♦ ❢r♦♠ n t♦ 2 n ✿ ✇❡ ❝❛♥ ❤❛♥❞❧❡ ♣r♦❜❧❡♠s t✇✐❝❡ ❛s ❜✐❣✳ ❲✐t❤ ♣♦✇❡r ✇❡ ❝❛♥ ❞♦ ♠✉❝❤ ❜❡tt❡r st✐❧❧✱ ❣♦✐♥❣ ❢r♦♠ n t♦ n 2 ✳ ❆s②♠♣t♦t✐❝ ❝♦♠♣❧❡①✐t② r❡❢❡rs t♦ ❤♦✇ ❝♦sts ❣r♦✇ ✇✐t❤ ✐♥❝r❡❛s✐♥❣ ✐♥♣✉ts✳ ❈♦sts ✉s✉❛❧❧② r❡❢❡r t♦ t✐♠❡ ♦r s♣❛❝❡✳ ❙♣❛❝❡ ❝♦♠♣❧❡①✐t② ❝❛♥ ♥❡✈❡r ❡①❝❡❡❞ t✐♠❡ ❝♦♠♣❧❡①✐t②✱ ❢♦r ✐t t❛❦❡s t✐♠❡ t♦ ❞♦ ❛♥②t❤✐♥❣ ✇✐t❤ t❤❡ s♣❛❝❡✳ ❚✐♠❡ ❝♦♠♣❧❡①✐t② ♦❢t❡♥ ❣r❡❛t❧② ❡①❝❡❡❞s s♣❛❝❡ ❝♦♠♣❧❡①✐t②✳ ❚❤✐s ❧❡❝t✉r❡ ❝♦♥s✐❞❡rs ❤♦✇ t♦ ❡st✐♠❛t❡ ✈❛r✐♦✉s ❝♦sts ❛ss♦❝✐❛t❡❞ ✇✐t❤ ❛ ♣r♦✲ ❣r❛♠✳ ❆ ❜r✐❡❢ ✐♥tr♦❞✉❝t✐♦♥ t♦ ❛ ❞✐✣❝✉❧t s✉❜❥❡❝t✱ ✐t ❞r❛✇s ✉♣♦♥ t❤❡ ❡①❝❡❧❧❡♥t t❡①ts ❈♦♥❝r❡t❡ ▼❛t❤❡♠❛t✐❝s ❬✻❪ ❛♥❞ ■♥tr♦❞✉❝t✐♦♥ t♦ ❆❧❣♦r✐t❤♠s ❬✺❪✳

  24. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✻ Some Illustrative Figures complexity 1 second 1 minute 1 hour gain n × 60 1000 60,000 3,600,000 Slide 302 n lg n × 41 140 4,893 200,000 n 2 × 8 31 244 1,897 n 3 × 4 10 39 153 2 n +6 9 15 21 complexity = milliseconds needed for an input of size n ❚❤✐s t❛❜❧❡ ✭❡①❝❡r♣t❡❞ ❢r♦♠ ❆❤♦ ❡t ❛❧✳ ❬✷✱ ♣❛❣❡ ✸❪✮ ✐❧❧✉str❛t❡s t❤❡ ❡✛❡❝t ♦❢ ✈❛r✐♦✉s t✐♠❡ ❝♦♠♣❧❡①✐t✐❡s✳ ❚❤❡ ❧❡❢t✲❤❛♥❞ ❝♦❧✉♠♥ ✐♥❞✐❝❛t❡s ❤♦✇ ♠❛♥② ♠✐❧❧✐s❡❝♦♥❞s ❛r❡ r❡q✉✐r❡❞ t♦ ♣r♦❝❡ss ❛♥ ✐♥♣✉t ♦❢ s✐③❡ n ✳ ❚❤❡ ♦t❤❡r ❡♥tr✐❡s s❤♦✇ t❤❡ ♠❛①✐♠✉♠ s✐③❡ ♦❢ n t❤❛t ❝❛♥ ❜❡ ♣r♦❝❡ss❡❞ ✐♥ t❤❡ ❣✐✈❡♥ t✐♠❡ ✭♦♥❡ s❡❝♦♥❞✱ ♠✐♥✉t❡ ♦r ❤♦✉r✮✳ ❚❤❡ t❛❜❧❡ ✐❧❧✉str❛t❡s ❤♦✇ ❤♦✇ ❧❛r❣❡ ❛♥ ✐♥♣✉t ❝❛♥ ❜❡ ♣r♦❝❡ss❡❞ ❛s ❛ ❢✉♥❝✲ t✐♦♥ ♦❢ t✐♠❡✳ ❆s ✇❡ ✐♥❝r❡❛s❡ t❤❡ ❝♦♠♣✉t❡r t✐♠❡ ♣❡r ✐♥♣✉t ❢r♦♠ ♦♥❡ s❡❝♦♥❞ t♦ ♦♥❡ ♠✐♥✉t❡ ❛♥❞ t❤❡♥ t♦ ♦♥❡ ❤♦✉r✱ t❤❡ s✐③❡ ♦❢ t❤❡ ✐♥♣✉t ✐♥❝r❡❛s❡s ❛❝❝♦r❞✐♥❣❧②✳ ❚❤❡ t♦♣ t✇♦ r♦✇s ✭❝♦♠♣❧❡①✐t✐❡s n ❛♥❞ n lg n ✮ ✐♥❝r❡❛s❡ r❛♣✐❞❧②✿ ❢♦r n ✱ ❜② ❛ ❢❛❝t♦r ♦❢ ✻✵✳ ❚❤❡ ❜♦tt♦♠ t✇♦ st❛rt ♦✉t ❝❧♦s❡ t♦❣❡t❤❡r✱ ❜✉t n 3 ✭✇❤✐❝❤ ❣r♦✇s ❜② ❛ ❢❛❝t♦r ♦❢ ✸✳✾✮ ♣✉❧❧s ✇❡❧❧ ❛✇❛② ❢r♦♠ 2 n ✭✇❤♦s❡ ❣r♦✇t❤ ✐s ♦♥❧② ❛❞❞✐t✐✈❡✮✳ ■❢ ❛♥ ❛❧❣♦r✐t❤♠✬s ❝♦♠♣❧❡①✐t② ✐s ❡①♣♦♥❡♥t✐❛❧ t❤❡♥ ✐t ❝❛♥ ♥❡✈❡r ❤❛♥❞❧❡ ❧❛r❣❡ ✐♥♣✉ts✱ ❡✈❡♥ ✐❢ ✐t ✐s ❣✐✈❡♥ ❤✉❣❡ r❡s♦✉r❝❡s✳ ❖♥ t❤❡ ♦t❤❡r ❤❛♥❞✱ s✉♣♣♦s❡ t❤❡ ❝♦♠♣❧❡①✐t② ❤❛s t❤❡ ❢♦r♠ n c ✱ ✇❤❡r❡ c ✐s ❛ ❝♦♥st❛♥t✳ ✭❲❡ s❛② t❤❡ ❝♦♠♣❧❡①✐t② ✐s ♣♦❧②♥♦♠✐❛❧ ✳✮ ❉♦✉❜❧✐♥❣ t❤❡ ❛r❣✉♠❡♥t t❤❡♥ ✐♥❝r❡❛s❡s t❤❡ ❝♦st ❜② ❛ ❝♦♥st❛♥t ❢❛❝t♦r✳ ❚❤❛t ✐s ♠✉❝❤ ❜❡tt❡r✱ t❤♦✉❣❤ ✐❢ c > 3 t❤❡ ❛❧❣♦r✐t❤♠ ♠❛② ♥♦t ❜❡ ❝♦♥s✐❞❡r❡❞ ♣r❛❝t✐❝❛❧✳ ❆❞❞ ❛ ❝♦❧✉♠♥ t♦ t❤❡ t❛❜❧❡ ✇✐t❤ t❤❡ ❤❡❛❞✐♥❣ ✻✵ ❤♦✉rs ✳ ❊①❡r❝✐s❡ ✸✳✶

  25. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✼ Comparing Algorithms Look at the most significant term. Slide 303 Ignore constant factors : • They are seldom important. • They depend on ephemeral details such as computer brand. Example: consider n 2 instead of 3 n 2 + 34 n + 433 . ❚❤❡ ❝♦st ♦❢ ❛ ♣r♦❣r❛♠ ✐s ✉s✉❛❧❧② ❛ ❝♦♠♣❧✐❝❛t❡❞ ❢♦r♠✉❧❛✳ ❖❢t❡♥ ✇❡ s❤♦✉❧❞ ❝♦♥s✐❞❡r ♦♥❧② t❤❡ ♠♦st s✐❣♥✐✜❝❛♥t t❡r♠✳ ■❢ t❤❡ ❝♦st ✐s n 2 + 99 n + 900 ❢♦r ❛♥ ✐♥♣✉t ♦❢ s✐③❡ n ✱ t❤❡♥ t❤❡ n 2 t❡r♠ ✇✐❧❧ ❡✈❡♥t✉❛❧❧② ❞♦♠✐♥❛t❡✱ ❡✈❡♥ t❤♦✉❣❤ 99 n ✐s ❜✐❣❣❡r ❢♦r n < 99 ✳ ❚❤❡ ❝♦♥st❛♥t t❡r♠ ✾✵✵ ♠❛② ❧♦♦❦ ❜✐❣✱ ❜✉t ❛s n ✐♥❝r❡❛s❡s ✐t r❛♣✐❞❧② ❜❡❝♦♠❡s ✐♥s✐❣♥✐✜❝❛♥t✳ ❈♦♥st❛♥t ❢❛❝t♦rs ✐♥ ❝♦sts ❛r❡ ♦❢t❡♥ ✐❣♥♦r❡❞✳ ❋♦r ♦♥❡ t❤✐♥❣✱ t❤❡② s❡❧❞♦♠ ♠❛❦❡ ❛ ❞✐✛❡r❡♥❝❡✿ 100 n 2 ✇✐❧❧ ❜❡ ❜❡tt❡r t❤❛♥ n 3 ✐♥ t❤❡ ❧♦♥❣ r✉♥✳ ❖♥❧② ✐❢ t❤❡ ❧❡❛❞✐♥❣ t❡r♠s ❛r❡ ♦t❤❡r✇✐s❡ ✐❞❡♥t✐❝❛❧ ❞♦ ❝♦♥st❛♥t ❢❛❝t♦rs ❜❡❝♦♠❡ ✐♠♣♦rt❛♥t✳ ❇✉t t❤❡r❡ ✐s ❛ s❡❝♦♥❞ ❞✐✣❝✉❧t②✿ ❝♦♥st❛♥t ❢❛❝t♦rs ❛r❡ s❡❧❞♦♠ r❡❧✐❛❜❧❡✳ ❚❤❡② ❞❡♣❡♥❞ ✉♣♦♥ ❞❡t❛✐❧s s✉❝❤ ❛s ✇❤✐❝❤ ❤❛r❞✇❛r❡✱ ♦♣❡r❛t✐♥❣ s②st❡♠ ♦r ♣r♦❣r❛♠✲ ♠✐♥❣ ❧❛♥❣✉❛❣❡ ✐s ❜❡✐♥❣ ✉s❡❞✳ ❇② ✐❣♥♦r✐♥❣ ❝♦♥st❛♥t ❢❛❝t♦rs✱ ✇❡ ❝❛♥ ♠❛❦❡ ❝♦♠♣❛r✐s♦♥s ❜❡t✇❡❡♥ ❛❧❣♦r✐t❤♠s t❤❛t r❡♠❛✐♥ ✈❛❧✐❞ ✐♥ ❛ ❜r♦❛❞ r❛♥❣❡ ♦❢ ❝✐r✲ ❝✉♠st❛♥❝❡s✳ ■♥ ♣r❛❝t✐❝❡✱ ❝♦♥st❛♥t ❢❛❝t♦rs s♦♠❡t✐♠❡s ♠❛tt❡r✳ ■❢ ❛♥ ❛❧❣♦r✐t❤♠ ✐s t♦♦ ❝♦♠♣❧✐❝❛t❡❞✱ ✐ts ❝♦sts ✇✐❧❧ ✐♥❝❧✉❞❡ ❛ ❧❛r❣❡ ❝♦♥st❛♥t ❢❛❝t♦r✳ ■♥ t❤❡ ❝❛s❡ ♦❢ ♠✉❧✲ t✐♣❧✐❝❛t✐♦♥✱ t❤❡ t❤❡♦r❡t✐❝❛❧❧② ❢❛st❡st ❛❧❣♦r✐t❤♠ ❝❛t❝❤❡s ✉♣ ✇✐t❤ t❤❡ st❛♥❞❛r❞ ♦♥❡ ♦♥❧② ❢♦r ❡♥♦r♠♦✉s ✈❛❧✉❡s ♦❢ n ✳

  26. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✽ O Notation (And Friends) f ( n ) = O ( g ( n )) provided | f ( n ) | ≤ c | g ( n ) | • for some constant c • and all sufficiently large n . Slide 304 f ( n ) = O ( g ( n )) means g is an upper bound on f f ( n ) = Ω( g ( n )) means g is an lower bound on f f ( n ) = Θ( g ( n )) means g gives exact bounds on f ❚❤❡ ❵❇✐❣ ❖✬ ♥♦t❛t✐♦♥ ✐s ❝♦♠♠♦♥❧② ✉s❡❞ t♦ ❞❡s❝r✐❜❡ ❡✣❝✐❡♥❝②✖t♦ ❜❡ ♣r❡✲ ❝✐s❡✱ ❛s②♠♣t♦t✐❝ ❝♦♠♣❧❡①✐t② ✳ ■t ❝♦♥❝❡r♥s t❤❡ ❧✐♠✐t ♦❢ ❛ ❢✉♥❝t✐♦♥ ❛s ✐ts ❛r❣✉✲ ♠❡♥t t❡♥❞s t♦ ✐♥✜♥✐t②✳ ■t ✐s ❛♥ ❛❜str❛❝t✐♦♥ t❤❛t ♠❡❡ts t❤❡ ✐♥❢♦r♠❛❧ ❝r✐t❡r✐❛ t❤❛t ✇❡ ❤❛✈❡ ❥✉st ❞✐s❝✉ss❡❞✳ ■♥ t❤❡ ❞❡✜♥✐t✐♦♥✱ s✉✣❝✐❡♥t❧② ❧❛r❣❡ ♠❡❛♥s t❤❡r❡ ✐s s♦♠❡ ❝♦♥st❛♥t n 0 s✉❝❤ t❤❛t | f ( n ) | ≤ c | g ( n ) | ❢♦r ❛❧❧ n ❣r❡❛t❡r t❤❛♥ n 0 ✳ ❚❤❡ r♦❧❡ ♦❢ n 0 ✐s t♦ ✐❣♥♦r❡ ✜♥✐t❡❧② ♠❛♥② ❡①❝❡♣t✐♦♥s t♦ t❤❡ ❜♦✉♥❞✱ s✉❝❤ ❛s t❤❡ ❝❛s❡s ✇❤❡♥ 99 n ❡①❝❡❡❞s n 2 ✳ ❚❤❡ ♥♦t❛t✐♦♥ ❛❧s♦ ✐❣♥♦r❡s ❝♦♥st❛♥t ❢❛❝t♦rs s✉❝❤ ❛s c ✳ ❲❡ ♠❛② ✉s❡ ❛ ❞✐✛❡r❡♥t c ❛♥❞ n 0 ✇✐t❤ ❡❛❝❤ f ✳ ❚❤❡ st❛♥❞❛r❞ ♥♦t❛t✐♦♥ f ( n ) = O ( g ( n )) ✐s ♠✐s❧❡❛❞✐♥❣✿ t❤✐s ✐s ♥♦ ❡q✉❛t✐♦♥✳ P❧❡❛s❡ ✉s❡ ❝♦♠♠♦♥ s❡♥s❡✳ ❋r♦♠ f ( n ) = O ( n ) ❛♥❞ f ′ ( n ) = O ( n ) ✇❡ ❝❛♥♥♦t ✐♥❢❡r f ( n ) = f ′ ( n ) ✳ ◆♦t❡ t❤❛t f ( n ) = O ( g ( n )) ❣✐✈❡s ❛♥ ✉♣♣❡r ❜♦✉♥❞ ♦♥ f ✐♥ t❡r♠s ♦❢ g ✳ ❚♦ s♣❡❝✐❢② ❛ ❧♦✇❡r ❜♦✉♥❞✱ ✇❡ ❤❛✈❡ t❤❡ ❞✉❛❧ ♥♦t❛t✐♦♥ f ( n ) = Ω( g ( n )) ⇐ ⇒ | f ( n ) | ≥ c | g ( n )) | ❢♦r s♦♠❡ ❝♦♥st❛♥t c ❛♥❞ ❛❧❧ s✉✣❝✐❡♥t❧② ❧❛r❣❡ n ✳ ❚❤❡ ❝♦♥❥✉♥❝t✐♦♥ ♦❢ f ( n ) = O ( g ( n )) ❛♥❞ f ( n ) = Ω( g ( n )) ✐s ✇r✐tt❡♥ f ( n ) = Θ( g ( n )) ✳ P❡♦♣❧❡ ♦❢t❡♥ ✉s❡ O ( g ( n )) ❛s ✐❢ ✐t ❣❛✈❡ ❛ t✐❣❤t ❜♦✉♥❞✱ ❝♦♥❢✉s✐♥❣ ✐t ✇✐t❤ Θ( g ( n )) ✳ ❙✐♥❝❡ O ( g ( n )) ❣✐✈❡s ❛♥ ✉♣♣❡r ❜♦✉♥❞✱ ✐❢ f ( n ) = O ( n ) t❤❡♥ ❛❧s♦ f ( n ) = O ( n 2 ) ✳ ❚r✐❝❦② ❡①❛♠✐♥❛t✐♦♥ q✉❡st✐♦♥s ❡①♣❧♦✐t t❤✐s ❢❛❝t✳

  27. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✾ Simple Facts About O Notation O (2 g ( n )) is the same as O ( g ( n )) O (log 10 n ) is the same as O (ln n ) Slide 305 O ( n 2 + 50 n + 36) is the same as O ( n 2 ) O ( n 2 ) is contained in O ( n 3 ) O (2 n ) is contained in O (3 n ) O (log n ) is contained in O ( √ n ) O ♥♦t❛t✐♦♥ ❧❡ts ✉s r❡❛s♦♥ ❛❜♦✉t t❤❡ ❝♦sts ♦❢ ❛❧❣♦r✐t❤♠s ❡❛s✐❧②✳ • ❈♦♥st❛♥t ❢❛❝t♦rs s✉❝❤ ❛s t❤❡ ✷ ✐♥ O (2 g ( n )) ❞r♦♣ ♦✉t✿ ✇❡ ❝❛♥ ✉s❡ O ( g ( n )) ✇✐t❤ t✇✐❝❡ t❤❡ ✈❛❧✉❡ ♦❢ c ✐♥ t❤❡ ❞❡✜♥✐t✐♦♥✳ • ❇❡❝❛✉s❡ ❝♦♥st❛♥t ❢❛❝t♦rs ❞r♦♣ ♦✉t✱ t❤❡ ❜❛s❡ ♦❢ ❧♦❣❛r✐t❤♠s ✐s ✐rr❡❧❡✈❛♥t✳ • ■♥s✐❣♥✐✜❝❛♥t t❡r♠s ❞r♦♣ ♦✉t✳ ❚♦ s❡❡ t❤❛t O ( n 2 + 50 n + 36) ✐s t❤❡ s❛♠❡ ❛s O ( n 2 ) ✱ ❝♦♥s✐❞❡r t❤❡ ✈❛❧✉❡ ♦❢ n 0 ♥❡❡❞❡❞ ✐♥ f ( n ) = O ( n 2 + 50 n + 36) ✳ ❯s✐♥❣ t❤❡ ❧❛✇ ( n + k ) 2 = n 2 + 2 nk + k 2 ✱ ✐t ✐s ❡❛s② t♦ ❝❤❡❝❦ t❤❛t ✉s✐♥❣ n 0 + 25 ❢♦r n 0 ❛♥❞ ❦❡❡♣✐♥❣ t❤❡ s❛♠❡ ✈❛❧✉❡ ♦❢ c ❣✐✈❡s f ( n ) = O ( n 2 ) ✳ ■❢ c ❛♥❞ d ❛r❡ ❝♦♥st❛♥ts ✭t❤❛t ✐s✱ t❤❡② ❛r❡ ✐♥❞❡♣❡♥❞❡♥t ♦❢ n ✮ ✇✐t❤ 0 < c < d t❤❡♥ O ( n c ) ✐s ❝♦♥t❛✐♥❡❞ ✐♥ O ( n d ) O ( c n ) ✐s ❝♦♥t❛✐♥❡❞ ✐♥ O ( d n ) O (log n ) ✐s ❝♦♥t❛✐♥❡❞ ✐♥ O ( n c ) ❚♦ s❛② t❤❛t O ( c n ) ✐s ❝♦♥t❛✐♥❡❞ ✐♥ O ( d n ) ♠❡❛♥s t❤❛t t❤❡ ❢♦r♠❡r ❣✐✈❡s ❛ t✐❣❤t❡r ❜♦✉♥❞ t❤❛♥ t❤❡ ❧❛tt❡r✳ ❋♦r ❡①❛♠♣❧❡✱ ✐❢ f ( n ) = O (2 n ) t❤❡♥ f ( n ) = O (3 n ) tr✐✈✐❛❧❧②✱ ❜✉t t❤❡ ❝♦♥✈❡rs❡ ❞♦❡s ♥♦t ❤♦❧❞✳

  28. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✵ Common Complexity Classes O (1) constant O (log n ) logarithmic Slide 306 O ( n ) linear O ( n log n ) quasi-linear O ( n 2 ) quadratic O ( n 3 ) cubic O ( a n ) exponential (for fixed a ) ▲♦❣❛r✐t❤♠s ❣r♦✇ ✈❡r② s❧♦✇❧②✱ s♦ O (log n ) ❝♦♠♣❧❡①✐t② ✐s ❡①❝❡❧❧❡♥t✳ ❇❡❝❛✉s❡ O ♥♦t❛t✐♦♥ ✐❣♥♦r❡s ❝♦♥st❛♥t ❢❛❝t♦rs✱ t❤❡ ❜❛s❡ ♦❢ t❤❡ ❧♦❣❛r✐t❤♠ ✐s ✐rr❡❧❡✈❛♥t✦ ❯♥❞❡r ❧✐♥❡❛r ✇❡ ♠✐❣❤t ♠❡♥t✐♦♥ O ( n log n ) ✱ ✇❤✐❝❤ ♦❝❝❛s✐♦♥❛❧❧② ✐s ❝❛❧❧❡❞ q✉❛s✐✲❧✐♥❡❛r ✱ ❛♥❞ ✇❤✐❝❤ s❝❛❧❡s ✉♣ ✇❡❧❧ ❢♦r ❧❛r❣❡ n ✳ ❆♥ ❡①❛♠♣❧❡ ♦❢ q✉❛❞r❛t✐❝ ❝♦♠♣❧❡①✐t② ✐s ♠❛tr✐① ❛❞❞✐t✐♦♥✿ ❢♦r♠✐♥❣ t❤❡ s✉♠ ♦❢ t✇♦ n × n ♠❛tr✐❝❡s ♦❜✈✐♦✉s❧② t❛❦❡s n 2 ❛❞❞✐t✐♦♥s✳ ▼❛tr✐① ♠✉❧t✐♣❧✐❝❛t✐♦♥ ✐s ♦❢ ❝✉❜✐❝ ❝♦♠♣❧❡①✐t②✱ ✇❤✐❝❤ ❧✐♠✐ts t❤❡ s✐③❡ ♦❢ ♠❛tr✐❝❡s t❤❛t ✇❡ ❝❛♥ ♠✉❧t✐♣❧② ✐♥ r❡❛s♦♥❛❜❧❡ t✐♠❡✳ ❆♥ O ( n 2 . 81 ) ❛❧❣♦r✐t❤♠ ❡①✐sts✱ ❜✉t ✐t ✐s t♦♦ ❝♦♠♣❧✐❝❛t❡❞ t♦ ❜❡ ♦❢ ♠✉❝❤ ✉s❡✱ ❡✈❡♥ t❤♦✉❣❤ ✐t ✐s t❤❡♦r❡t✐❝❛❧❧② ❜❡tt❡r✳ ❆♥ ❡①♣♦♥❡♥t✐❛❧ ❣r♦✇t❤ r❛t❡ s✉❝❤ ❛s 2 n r❡str✐❝ts ✉s t♦ s♠❛❧❧ ✈❛❧✉❡s ♦❢ n ✳ ❆❧r❡❛❞② ✇✐t❤ n = 20 t❤❡ ❝♦st ❡①❝❡❡❞s ♦♥❡ ♠✐❧❧✐♦♥✳ ❍♦✇❡✈❡r✱ t❤❡ ✇♦rst ❝❛s❡ ♠✐❣❤t ♥♦t ❛r✐s❡ ✐♥ ♥♦r♠❛❧ ♣r❛❝t✐❝❡✳ ▼▲ t②♣❡✲❝❤❡❝❦✐♥❣ ✐s ❡①♣♦♥❡♥t✐❛❧ ✐♥ t❤❡ ✇♦rst ❝❛s❡✱ ❜✉t ♥♦t ❢♦r ♦r❞✐♥❛r② ♣r♦❣r❛♠s✳

  29. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✶ Sample Costs in O Notation function time space npower , nsum O ( n ) O ( n ) Slide 307 summing O ( n ) O (1) n ( n + 1) / 2 O (1) O (1) power O (log n ) O (log n ) nthApprox O (2 n ) O ( n ) ❘❡❝❛❧❧ ✭▲❡❝t✳ ✷✮ t❤❛t ♥♣♦✇❡r ❝♦♠♣✉t❡s x n ❜② r❡♣❡❛t❡❞ ♠✉❧t✐♣❧✐❝❛t✐♦♥ ✇❤✐❧❡ ♥s✉♠ ♥❛ï✈❡❧② ❝♦♠♣✉t❡s t❤❡ s✉♠ 1 + · · · + n ✳ ❊❛❝❤ ♦❜✈✐♦✉s❧② ♣❡r❢♦r♠s O ( n ) ❛r✐t❤♠❡t✐❝ ♦♣❡r❛t✐♦♥s✳ ❇❡❝❛✉s❡ t❤❡② ❛r❡ ♥♦t t❛✐❧ r❡❝✉rs✐✈❡✱ t❤❡✐r ✉s❡ ♦❢ s♣❛❝❡ ✐s ❛❧s♦ O ( n ) ✳ ❚❤❡ ❢✉♥❝t✐♦♥ s✉♠♠✐♥❣ ✐s ❛ ✈❡rs✐♦♥ ♦❢ ♥s✉♠ ✇✐t❤ ❛♥ ❛❝❝✉✲ ♠✉❧❛t✐♥❣ ❛r❣✉♠❡♥t❀ ✐ts ✐t❡r❛t✐✈❡ ❜❡❤❛✈✐♦✉r ❧❡ts ✐t ✇♦r❦ ✐♥ ❝♦♥st❛♥t s♣❛❝❡✳ O ♥♦t❛t✐♦♥ s♣❛r❡s ✉s ❢r♦♠ ❤❛✈✐♥❣ t♦ s♣❡❝✐❢② t❤❡ ✉♥✐ts ✉s❡❞ t♦ ♠❡❛s✉r❡ s♣❛❝❡✳ ❊✈❡♥ ✐❣♥♦r✐♥❣ ❝♦♥st❛♥t ❢❛❝t♦rs✱ t❤❡ ✉♥✐ts ❝❤♦s❡♥ ❝❛♥ ✐♥✢✉❡♥❝❡ t❤❡ r❡s✉❧t✳ ▼✉❧t✐♣❧✐❝❛t✐♦♥ ♠❛② ❜❡ r❡❣❛r❞❡❞ ❛s ❛ s✐♥❣❧❡ ✉♥✐t ♦❢ ❝♦st✳ ❍♦✇❡✈❡r✱ t❤❡ ❝♦st ♦❢ ♠✉❧t✐♣❧②✐♥❣ t✇♦ n ✲❞✐❣✐t ♥✉♠❜❡rs ❢♦r ❧❛r❣❡ n ✐s ✐ts❡❧❢ ❛♥ ✐♠♣♦rt❛♥t q✉❡st✐♦♥✱ ❡s♣❡❝✐❛❧❧② ♥♦✇ t❤❛t ♣✉❜❧✐❝✲❦❡② ❝r②♣t♦❣r❛♣❤② ✉s❡s ♥✉♠❜❡rs ❤✉♥❞r❡❞s ♦❢ ❞✐❣✐ts ❧♦♥❣✳ ❋❡✇ t❤✐♥❣s ❝❛♥ r❡❛❧❧② ❜❡ ❞♦♥❡ ✐♥ ❝♦♥st❛♥t t✐♠❡ ♦r st♦r❡❞ ✐♥ ❝♦♥st❛♥t s♣❛❝❡✳ ▼❡r❡❧② t♦ st♦r❡ t❤❡ ♥✉♠❜❡r n r❡q✉✐r❡s O (log n ) ❜✐ts✳ ■❢ ❛ ♣r♦❣r❛♠ ❝♦st ✐s O (1) ✱ t❤❡♥ ✇❡ ❤❛✈❡ ♣r♦❜❛❜❧② ❛ss✉♠❡❞ t❤❛t ❝❡rt❛✐♥ ♦♣❡r❛t✐♦♥s ✐t ♣❡r❢♦r♠s ❛r❡ ❛❧s♦ O (1) ✖t②♣✐❝❛❧❧② ❜❡❝❛✉s❡ ✇❡ ❡①♣❡❝t ♥❡✈❡r t♦ ❡①❝❡❡❞ t❤❡ ❝❛♣❛❝✐t② ♦❢ t❤❡ st❛♥❞❛r❞ ❤❛r❞✇❛r❡ ❛r✐t❤♠❡t✐❝✳ ❲✐t❤ ♣♦✇❡r ✱ t❤❡ ♣r❡❝✐s❡ ♥✉♠❜❡r ♦❢ ♦♣❡r❛t✐♦♥s ❞❡♣❡♥❞s ✉♣♦♥ n ✐♥ ❛ ❝♦♠✲ ♣❧✐❝❛t❡❞ ✇❛②✱ ❞❡♣❡♥❞✐♥❣ ♦♥ ❤♦✇ ♠❛♥② ♦❞❞ ♥✉♠❜❡rs ❛r✐s❡✱ s♦ ✐t ✐s ❝♦♥✈❡♥✐❡♥t t❤❛t ✇❡ ❝❛♥ ❥✉st ✇r✐t❡ O (log n ) ✳ ❆♥ ❛❝❝✉♠✉❧❛t✐♥❣ ❛r❣✉♠❡♥t ❝♦✉❧❞ r❡❞✉❝❡ ✐ts s♣❛❝❡ ❝♦st t♦ O (1) ✳

  30. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✷ Solving Simple Recurrence Relations T ( n ) : a cost we want to bound using O notation Typical base case : T (1) = 1 Slide 308 Some recurrences : T ( n + 1) = T ( n ) + 1 linear T ( n + 1) = T ( n ) + n quadratic T ( n ) = T ( n/ 2) + 1 logarithmic ❚♦ ❛♥❛❧②③❡ ❛ ❢✉♥❝t✐♦♥✱ ✐♥s♣❡❝t ✐ts ▼▲ ❞❡❝❧❛r❛t✐♦♥✳ ❘❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥s ❢♦r t❤❡ ❝♦st ❢✉♥❝t✐♦♥ T ( n ) ❝❛♥ ✉s✉❛❧❧② ❜❡ r❡❛❞ ♦✛✳ ❙✐♥❝❡ ✇❡ ✐❣♥♦r❡ ❝♦♥st❛♥t ❢❛❝t♦rs✱ ✇❡ ❝❛♥ ❣✐✈❡ t❤❡ ❜❛s❡ ❝❛s❡ ❛ ❝♦st ♦❢ ♦♥❡ ✉♥✐t✳ ❈♦♥st❛♥t ✇♦r❦ ❞♦♥❡ ✐♥ t❤❡ r❡❝✉rs✐✈❡ st❡♣ ❝❛♥ ❛❧s♦ ❜❡ ❣✐✈❡♥ ✉♥✐t ❝♦st❀ s✐♥❝❡ ✇❡ ♦♥❧② ♥❡❡❞ ❛♥ ✉♣♣❡r ❜♦✉♥❞✱ t❤✐s ✉♥✐t r❡♣r❡s❡♥ts t❤❡ ❧❛r❣❡r ♦❢ t❤❡ t✇♦ ❛❝t✉❛❧ ❝♦sts✳ ❲❡ ❝♦✉❧❞ ✉s❡ ♦t❤❡r ❝♦♥st❛♥ts ✐❢ ✐t s✐♠♣❧✐✜❡s t❤❡ ❛❧❣❡❜r❛✳ ❋♦r ❡①❛♠♣❧❡✱ r❡❝❛❧❧ ♦✉r ❢✉♥❝t✐♦♥ ♥s✉♠ ✿ ❢✉♥ ♥s✉♠ ♥ ❂ ✐❢ ♥❂✵ t❤❡♥ ✵ ❡❧s❡ ♥ ✰ ♥s✉♠ ✭♥✲✶✮❀ ●✐✈❡♥ n + 1 ✱ ✐t ♣❡r❢♦r♠s ❛ ❝♦♥st❛♥t ❛♠♦✉♥t ♦❢ ✇♦r❦ ✭❛♥ ❛❞❞✐t✐♦♥ ❛♥❞ s✉❜✲ tr❛❝t✐♦♥✮ ❛♥❞ ❝❛❧❧s ✐ts❡❧❢ r❡❝✉rs✐✈❡❧② ✇✐t❤ ❛r❣✉♠❡♥t n ✳ ❲❡ ❣❡t t❤❡ r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥s T (0) = 1 ❛♥❞ T ( n + 1) = T ( n ) + 1 ✳ ❚❤❡ ❝❧♦s❡❞ ❢♦r♠ ✐s ❝❧❡❛r❧② T ( n ) = n + 1 ✱ ❛s ✇❡ ❝❛♥ ❡❛s✐❧② ✈❡r✐❢② ❜② s✉❜st✐t✉t✐♦♥✳ ❚❤❡ ❝♦st ✐s ❧✐♥❡❛r ✳ ❚❤✐s ❢✉♥❝t✐♦♥✱ ❣✐✈❡♥ n + 1 ✱ ❝❛❧❧s ♥s✉♠ ✱ ♣❡r❢♦r♠✐♥❣ O ( n ) ✇♦r❦✳ ❆❣❛✐♥ ✐❣♥♦r✐♥❣ ❝♦♥st❛♥t ❢❛❝t♦rs✱ ✇❡ ❝❛♥ s❛② t❤❛t t❤✐s ❝❛❧❧ t❛❦❡s ❡①❛❝t❧② n ✉♥✐ts✳ ❢✉♥ ♥s✉♠s✉♠ ♥ ❂ ✐❢ ♥❂✵ t❤❡♥ ✵ ❡❧s❡ ♥s✉♠ ♥ ✰ ♥s✉♠s✉♠ ✭♥✲✶✮❀ ❲❡ ❣❡t t❤❡ r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥s T (0) = 1 ❛♥❞ T ( n + 1) = T ( n ) + n ✳ ■t ✐s ❡❛s② t♦ s❡❡ t❤❛t T ( n ) = ( n − 1) + · · · + 1 = n ( n − 1) / 2 = O ( n 2 ) ✳ ❚❤❡ ❝♦st ✐s q✉❛❞r❛t✐❝ ✳ ❚❤❡ ❢✉♥❝t✐♦♥ ♣♦✇❡r ❞✐✈✐❞❡s ✐ts ✐♥♣✉t n ✐♥t♦ t✇♦✱ ✇✐t❤ t❤❡ r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥ T ( n ) = T ( n/ 2) + 1 ✳ ❈❧❡❛r❧② T (2 n ) = n + 1 ✱ s♦ T ( n ) = O (log n ) ✳

  31. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✸ Recurrence for nthApprox : O (2 n ) T (0) = 1 T ( n + 1) = 2 T ( n ) + 1 Slide 309 Explicit solution: T ( n ) = 2 n +1 − 1 T ( n + 1) = 2 T ( n ) + 1 = 2(2 n +1 − 1) + 1 induction hypothesis = 2 n +2 − 1 ◆♦✇ ✇❡ ❛♥❛❧②③❡ t❤❡ ❢✉♥❝t✐♦♥ ♥t❤❆♣♣r♦① ❣✐✈❡♥ ❛t t❤❡ st❛rt ♦❢ t❤❡ ❧❡❝t✉r❡✳ ❚❤❡ t✇♦ r❡❝✉rs✐✈❡ ❝❛❧❧s ❛r❡ r❡✢❡❝t❡❞ ✐♥ t❤❡ t❡r♠ 2 T ( n ) ♦❢ t❤❡ r❡❝✉rr❡♥❝❡✳ ❆s ❢♦r t❤❡ ❝♦♥st❛♥t ❡✛♦rt✱ ❛❧t❤♦✉❣❤ t❤❡ r❡❝✉rs✐✈❡ ❝❛s❡ ❞♦❡s ♠♦r❡ ✇♦r❦ t❤❛♥ t❤❡ ❜❛s❡ ❝❛s❡✱ ✇❡ ❝❛♥ ❝❤♦♦s❡ ✉♥✐ts s✉❝❤ t❤❛t ❜♦t❤ ❝♦♥st❛♥ts ❛r❡ ♦♥❡✳ ✭❘❡♠❡♠❜❡r✱ ✇❡ s❡❡❦ ❛♥ ✉♣♣❡r ❜♦✉♥❞ r❛t❤❡r t❤❛♥ t❤❡ ❡①❛❝t ❝♦st✳✮ ●✐✈❡♥ t❤❡ r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥s ❢♦r T ( n ) ✱ ❧❡t ✉s s♦❧✈❡ t❤❡♠✳ ■t ❤❡❧♣s ✐❢ ✇❡ ❝❛♥ ❣✉❡ss t❤❡ ❝❧♦s❡❞ ❢♦r♠✱ ✇❤✐❝❤ ✐♥ t❤✐s ❝❛s❡ ♦❜✈✐♦✉s❧② ✐s s♦♠❡t❤✐♥❣ ❧✐❦❡ 2 n ✳ ❊✈❛❧✉❛t✐♥❣ T ( n ) ❢♦r n = 0 ✱ ✶✱ ✷✱ ✸✱ ✳ ✳ ✳ ✱ ✇❡ ❣❡t ✶✱ ✸✱ ✼✱ ✶✺✱ ✳ ✳ ✳ ✳ ❖❜✈✐♦✉s❧② T ( n ) = 2 n +1 − 1 ✱ ✇❤✐❝❤ ✇❡ ❝❛♥ ❡❛s✐❧② ♣r♦✈❡ ❜② ✐♥❞✉❝t✐♦♥ ♦♥ n ✳ ❲❡ ♠✉st ❝❤❡❝❦ t❤❡ ❜❛s❡ ❝❛s❡✿ T (0) = 2 1 − 1 = 1 ■♥ t❤❡ ✐♥❞✉❝t✐✈❡ st❡♣✱ ❢♦r T ( n + 1) ✱ ✇❡ ♠❛② ❛ss✉♠❡ ♦✉r ❡q✉❛t✐♦♥ ✐♥ ♦r❞❡r t♦ r❡♣❧❛❝❡ T ( n ) ❜② 2 n +1 − 1 ✳ ❚❤❡ r❡st ✐s ❡❛s②✳ ❲❡ ❤❛✈❡ ♣r♦✈❡❞ T ( n ) = O (2 n +1 − 1) ✱ ❜✉t ♦❜✈✐♦✉s❧② 2 n ✐s ❛❧s♦ ❛♥ ✉♣♣❡r ❜♦✉♥❞✿ ✇❡ ♠❛② ❝❤♦♦s❡ t❤❡ ❝♦♥st❛♥t ❢❛❝t♦r t♦ ❜❡ t✇♦✳ ❍❡♥❝❡ T ( n ) = O (2 n ) ✳ ❚❤❡ ♣r♦♦❢ ❛❜♦✈❡ ✐s r❛t❤❡r ✐♥❢♦r♠❛❧✳ ❚❤❡ ♦rt❤♦❞♦① ✇❛② ♦❢ ♣r♦✈✐♥❣ f ( n ) = O ( g ( n )) ✐s t♦ ❢♦❧❧♦✇ t❤❡ ❞❡✜♥✐t✐♦♥ ♦❢ O ♥♦t❛t✐♦♥✳ ❇✉t ❛♥ ✐♥❞✉❝t✐✈❡ ♣r♦♦❢ ♦❢ T ( n ) ≤ c 2 n ✱ ✉s✐♥❣ t❤❡ ❞❡✜♥✐t✐♦♥ ♦❢ T ( n ) ✱ r✉♥s ✐♥t♦ ❞✐✣❝✉❧t✐❡s✿ t❤✐s ❜♦✉♥❞ ✐s t♦♦ ❧♦♦s❡✳ ❚✐❣❤t❡♥✐♥❣ t❤❡ ❜♦✉♥❞ t♦ T ( n ) ≤ c 2 n − 1 ❧❡ts t❤❡ ♣r♦♦❢ ❣♦ t❤r♦✉❣❤✳ ❚r② t❤❡ ♣r♦♦❢ s✉❣❣❡st❡❞ ❛❜♦✈❡✳ ❲❤❛t ❞♦❡s ✐t s❛② ❛❜♦✉t c ❄ ❊①❡r❝✐s❡ ✸✳✷

  32. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✹ An O ( n log n ) Recurrence T (1) = 0 T ( n ) = 2 T ( n/ 2) + n Slide 310 Proof that T ( n ) ≤ n lg n : T ( n ) ≤ 2( n/ 2) lg( n/ 2) + n = n (lg n − 1) + n = n lg n − n + n = n lg n ❚❤✐s r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥ ❛r✐s❡s ✇❤❡♥ ❛ ❢✉♥❝t✐♦♥ ❞✐✈✐❞❡s ✐ts ✐♥♣✉t ✐♥t♦ t✇♦ ❡q✉❛❧ ♣❛rts✱ ❞♦❡s O ( n ) ✇♦r❦ ❛♥❞ ❛❧s♦ ❝❛❧❧s ✐ts❡❧❢ r❡❝✉rs✐✈❡❧② ♦♥ ❡❛❝❤✳ ❙✉❝❤ ❜❛❧❛♥❝✐♥❣ ✐s ❜❡♥❡✜❝✐❛❧✳ ■♥st❡❛❞ ❞✐✈✐❞✐♥❣ t❤❡ ✐♥♣✉t ✐♥t♦ ✉♥❡q✉❛❧ ♣❛rts ♦❢ s✐③❡s ✶ ❛♥❞ n − 1 ❣✐✈❡s t❤❡ r❡❝✉rr❡♥❝❡ T ( n + 1) = T ( n ) + n ✱ ✇❤✐❝❤ ❤❛s q✉❛❞r❛t✐❝ ❝♦♠♣❧❡①✐t②✳ ❙❤♦✇♥ ♦♥ t❤❡ s❧✐❞❡ ✐s t❤❡ r❡s✉❧t ♦❢ s✉❜st✐t✉t✐♥❣ t❤❡ ❝❧♦s❡❞ ❢♦r♠ T ( n ) = cn lg n ✐♥t♦ t❤❡ ♦r✐❣✐♥❛❧ ❡q✉❛t✐♦♥s✳ ❚❤✐s ✐s ❛♥♦t❤❡r ♣r♦♦❢ ❜② ✐♥❞✉❝t✐♦♥✳ ❚❤❡ ❧❛st st❡♣ ❤♦❧❞s ♣r♦✈✐❞❡❞ c ≥ 1 ✳ ❙♦♠❡t❤✐♥❣ ✐s ✇r♦♥❣✱ ❤♦✇❡✈❡r✳ ❚❤❡ ❜❛s❡ ❝❛s❡ ❢❛✐❧s✿ ✐❢ n = 1 t❤❡♥ cn lg n = 0 ✱ ✇❤✐❝❤ ✐s ♥♦t ❛♥ ✉♣♣❡r ❜♦✉♥❞ ❢♦r T (1) ✳ ❲❡ ❝♦✉❧❞ ❧♦♦❦ ❢♦r ❛ ♣r❡❝✐s❡ ❝❧♦s❡❞ ❢♦r♠ ❢♦r T ( n ) ✱ ❜✉t ✐t ✐s s✐♠♣❧❡r t♦ r❡❝❛❧❧ t❤❛t O ♥♦t❛t✐♦♥ ❧❡ts ✉s ✐❣♥♦r❡ ❛ ✜♥✐t❡ ♥✉♠❜❡r ♦❢ ❛✇❦✇❛r❞ ❝❛s❡s✳ ❈❤♦♦s✐♥❣ n = 2 ❛♥❞ n = 3 ❛s ❜❛s❡ ❝❛s❡s ❡❧✐♠✐♥❛t❡s n = 1 ❡♥t✐r❡❧② ❢r♦♠ ❝♦♥s✐❞❡r❛t✐♦♥✳ ❚❤❡ ❝♦♥str❛✐♥ts T (2) ≤ 2 c lg 2 ❛♥❞ T (3) ≤ 3 c lg 3 ❝❛♥ ❜❡ s❛t✐s✜❡❞ ❢♦r c ≥ 2 ✳ ❙♦ T ( n ) = O ( n log n ) ✳ ■♥❝✐❞❡♥t❛❧❧②✱ ✐♥ t❤❡s❡ r❡❝✉rr❡♥❝❡s n/ 2 st❛♥❞s ❢♦r ✐♥t❡❣❡r ❞✐✈✐s✐♦♥✳ ❚♦ ❜❡ ♣r❡❝✐s❡✱ ✇❡ s❤♦✉❧❞ ✐♥❞✐❝❛t❡ tr✉♥❝❛t✐♦♥ t♦ t❤❡ ♥❡①t s♠❛❧❧❡r ✐♥t❡❣❡r ❜② ✇r✐t✐♥❣ ⌊ n/ 2 ⌋ ✳ ❖♥❡✲❤❛❧❢ ♦❢ ❛♥ ♦❞❞ ♥✉♠❜❡r ✐s ❣✐✈❡♥ ❜② ⌊ (2 n +1) / 2 ⌋ = n ✳ ❋♦r ❡①❛♠♣❧❡✱ ⌊ 2 . 9 ⌋ = 2 ✱ ❛♥❞ ⌊ n ⌋ = n ✐❢ n ✐s ❛♥ ✐♥t❡❣❡r✳

  33. ■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✺ ❋♦r ❛ ❞❡❡♣❡r tr❡❛t♠❡♥t ♦❢ ❝♦♠♣❧❡①✐t②✱ ②♦✉ ♠✐❣❤t ❧♦♦❦ ❛t ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ❈❤❛♣t❡r ✷ ♦❢ ■♥tr♦❞✉❝t✐♦♥ t♦ ❆❧❣♦r✐t❤♠s ❬✺❪✳ ❋✐♥❞ ❛♥ ✉♣♣❡r ❜♦✉♥❞ ❢♦r t❤❡ r❡❝✉rr❡♥❝❡ ❣✐✈❡♥ ❜② T (1) = 1 ❊①❡r❝✐s❡ ✸✳✸ ❛♥❞ T ( n ) = 2 T ( n/ 2) + 1 ✳ ❨♦✉ s❤♦✉❧❞ ❜❡ ❛❜❧❡ t♦ ✜♥❞ ❛ t✐❣❤t❡r ❜♦✉♥❞ t❤❛♥ O ( n log n ) ✳ Pr♦✈❡ t❤❛t t❤❡ r❡❝✉rr❡♥❝❡ ❊①❡r❝✐s❡ ✸✳✹ � ✐❢ 1 ≤ n < 4 1 T ( n ) = ✐❢ n ≥ 4 T ( ⌈ n/ 4 ⌉ ) + T ( ⌊ 3 n/ 4 ⌋ ) + n ✐s O ( n log n ) ✳ ❚❤❡ ♥♦t❛t✐♦♥ ⌈ x ⌉ ♠❡❛♥s tr✉♥❝❛t✐♦♥ t♦ t❤❡ ♥❡①t ❧❛r❣❡r ✐♥t❡❣❡r❀ ❢♦r ❡①❛♠♣❧❡✱ ⌈ 3 . 1 ⌉ = 4 ✳

  34. ■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✻ Lists [3,5,9]; > [3, 5, 9] : int list Slide 401 it @ [2,10]; > [3, 5, 9, 2, 10] : int list rev [(1,"one"), (2,"two")]; > [(2, "two"), (1, "one")] : (int * string) list ❆ ❧✐st ✐s ❛♥ ♦r❞❡r❡❞ s❡r✐❡s ♦❢ ❡❧❡♠❡♥ts❀ r❡♣❡t✐t✐♦♥s ❛r❡ s✐❣♥✐✜❝❛♥t✳ ❙♦ ❬✸✱✺✱✾❪ ❞✐✛❡rs ❢r♦♠ ❬✺✱✸✱✾❪ ❛♥❞ ❢r♦♠ ❬✸✱✸✱✺✱✾❪✳ ❆❧❧ ❡❧❡♠❡♥ts ♦❢ ❛ ❧✐st ♠✉st ❤❛✈❡ t❤❡ s❛♠❡ t②♣❡✳ ❆❜♦✈❡ ✇❡ s❡❡ ❛ ❧✐st ♦❢ ✐♥t❡❣❡rs ❛♥❞ ❛ ❧✐st ♦❢ ✭✐♥t❡❣❡r✱ str✐♥❣✮ ♣❛✐rs✳ ❖♥❡ ❝❛♥ ❛❧s♦ ❤❛✈❡ ❧✐sts ♦❢ ❧✐sts✱ s✉❝❤ ❛s ❬❬✸❪✱ ❬❪✱ ❬✺✱✻❪❪✱ ✇❤✐❝❤ ❤❛s t②♣❡ ✐♥t ❧✐st ❧✐st ✳ ■♥ t❤❡ ❣❡♥❡r❛❧ ❝❛s❡✱ ✐❢ x 1 ✱ ✳ ✳ ✳ ✱ x n ❛❧❧ ❤❛✈❡ t❤❡ s❛♠❡ t②♣❡ ✭s❛② τ ✮ t❤❡♥ t❤❡ ❧✐st [ x 1 , . . . , x n ] ❤❛s t②♣❡ ( τ ) list ✳ ▲✐sts ❛r❡ t❤❡ s✐♠♣❧❡st ❞❛t❛ str✉❝t✉r❡ t❤❛t ❝❛♥ ❜❡ ✉s❡❞ t♦ ♣r♦❝❡ss ❝♦❧✲ ❧❡❝t✐♦♥s ♦❢ ✐t❡♠s✳ ❈♦♥✈❡♥t✐♦♥❛❧ ❧❛♥❣✉❛❣❡s ✉s❡ ❛rr❛②s ✱ ✇❤♦s❡ ❡❧❡♠❡♥ts ❛r❡ ❛❝❝❡ss❡❞ ✉s✐♥❣ s✉❜s❝r✐♣t✐♥❣✿ ❢♦r ❡①❛♠♣❧❡✱ A [ i ] ②✐❡❧❞s t❤❡ i t❤ ❡❧❡♠❡♥t ♦❢ t❤❡ ❛rr❛② A ✳ ❙✉❜s❝r✐♣t✐♥❣ ❡rr♦rs ❛r❡ ❛ ❦♥♦✇♥ ❝❛✉s❡ ♦❢ ♣r♦❣r❛♠♠❡r ❣r✐❡❢✱ ❤♦✇✲ ❡✈❡r✱ s♦ ❛rr❛②s s❤♦✉❧❞ ❜❡ r❡♣❧❛❝❡❞ ❜② ❤✐❣❤❡r✲❧❡✈❡❧ ❞❛t❛ str✉❝t✉r❡s ✇❤❡♥❡✈❡r ♣♦ss✐❜❧❡✳ ❚❤❡ ✐♥✜① ♦♣❡r❛t♦r ❅ ✱ ❝❛❧❧❡❞ ❛♣♣❡♥❞ ✱ ❝♦♥❝❛t❡♥❛t❡s t✇♦ ❧✐sts✳ ❆❧s♦ ❜✉✐❧t✲✐♥ ✐s r❡✈ ✱ ✇❤✐❝❤ r❡✈❡rs❡s ❛ ❧✐st✳ ❚❤❡s❡ ❛r❡ ❞❡♠♦♥str❛t❡❞ ✐♥ t❤❡ s❡ss✐♦♥ ❛❜♦✈❡✳

  35. ■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✼ The List Primitives The two kinds of list nil or [] is the empty list x :: l is the list with head x and tail l Slide 402 List notation [ x 1 , x 2 , . . . , x n ] ≡ x 1 :: ( x 2 :: · · · ( x n :: nil )) � �� � tail head ❚❤❡ ♦♣❡r❛t♦r ✿✿✱ ❝❛❧❧❡❞ ❝♦♥s ✭❢♦r ❵❝♦♥str✉❝t✬✮✱ ♣✉ts ❛ ♥❡✇ ❡❧❡♠❡♥t ♦♥ t♦ t❤❡ ❤❡❛❞ ♦❢ ❛♥ ❡①✐st✐♥❣ ❧✐st✳ ❲❤✐❧❡ ✇❡ s❤♦✉❧❞ ♥♦t ❜❡ t♦♦ ♣r❡♦❝❝✉♣✐❡❞ ✇✐t❤ ✐♠♣❧❡♠❡♥t❛t✐♦♥ ❞❡t❛✐❧s✱ ✐t ✐s ❡ss❡♥t✐❛❧ t♦ ❦♥♦✇ t❤❛t ✿✿ ✐s ❛♥ O (1) ♦♣❡r❛t✐♦♥✳ ■t ✉s❡s ❝♦♥st❛♥t t✐♠❡ ❛♥❞ s♣❛❝❡✱ r❡❣❛r❞❧❡ss ♦❢ t❤❡ ❧❡♥❣t❤ ♦❢ t❤❡ r❡s✉❧t✐♥❣ ❧✐st✳ ▲✐sts ❛r❡ r❡♣r❡s❡♥t❡❞ ✐♥t❡r♥❛❧❧② ✇✐t❤ ❛ ❧✐♥❦❡❞ str✉❝t✉r❡❀ ❛❞❞✐♥❣ ❛ ♥❡✇ ❡❧❡♠❡♥t t♦ ❛ ❧✐st ♠❡r❡❧② ❤♦♦❦s t❤❡ ♥❡✇ ❡❧❡♠❡♥t t♦ t❤❡ ❢r♦♥t ♦❢ t❤❡ ❡①✐st✐♥❣ str✉❝t✉r❡✳ ▼♦r❡♦✈❡r✱ t❤❛t str✉❝t✉r❡ ❝♦♥t✐♥✉❡s t♦ ❞❡♥♦t❡ t❤❡ s❛♠❡ ❧✐st ❛s ✐t ❞✐❞ ❜❡❢♦r❡❀ t♦ s❡❡ t❤❡ ♥❡✇ ❧✐st✱ ♦♥❡ ♠✉st ❧♦♦❦ ❛t t❤❡ ♥❡✇ ✿✿ ♥♦❞❡ ✭♦r ❝♦♥s ❝❡❧❧ ✮ ❥✉st ❝r❡❛t❡❞✳ ❍❡r❡ ✇❡ s❡❡ t❤❡ ❡❧❡♠❡♥t ✶ ❜❡✐♥❣ ❝♦♥s❡❞ t♦ t❤❡ ❢r♦♥t ♦❢ t❤❡ ❧✐st ❬✸✱✺✱✾❪✿ :: → · · · :: → :: → :: → nil ↓ ↓ ↓ ↓ 1 3 5 9 ●✐✈❡♥ ❛ ❧✐st✱ t❛❦✐♥❣ ✐ts ✜rst ❡❧❡♠❡♥t ✭✐ts ❤❡❛❞ ✮ ♦r ✐ts ❧✐st ♦❢ r❡♠❛✐♥✐♥❣ ❡❧❡♠❡♥ts ✭✐ts t❛✐❧ ✮ ❛❧s♦ t❛❦❡s ❝♦♥st❛♥t t✐♠❡✳ ❊❛❝❤ ♦♣❡r❛t✐♦♥ ❥✉st ❢♦❧❧♦✇s ❛ ❧✐♥❦✳ ■♥ t❤❡ ❞✐❛❣r❛♠ ❛❜♦✈❡✱ t❤❡ ✜rst ↓ ❛rr♦✇ ❧❡❛❞s t♦ t❤❡ ❤❡❛❞ ❛♥❞ t❤❡ ❧❡❢t♠♦st → ❛rr♦✇ ❧❡❛❞s t♦ t❤❡ t❛✐❧✳ ❖♥❝❡ ✇❡ ❤❛✈❡ t❤❡ t❛✐❧✱ ✐ts ❤❡❛❞ ✐s t❤❡ s❡❝♦♥❞ ❡❧❡♠❡♥t ♦❢ t❤❡ ♦r✐❣✐♥❛❧ ❧✐st✱ ❡t❝✳ ❚❤❡ t❛✐❧ ✐s ♥♦t t❤❡ ❧❛st ❡❧❡♠❡♥t❀ ✐t ✐s t❤❡ ❧✐st ♦❢ ❛❧❧ ❡❧❡♠❡♥ts ♦t❤❡r t❤❛♥ t❤❡ ❤❡❛❞✦

  36. ■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✽ Getting at the Head and Tail fun null [] = true | null (x::l) = false; > val null = fn : ’a list -> bool Slide 403 fun hd (x::l) = x; > Warning: pattern matching is not exhaustive > val hd = fn : ’a list -> ’a tl [7,6,5]; > val it = [6, 5] : int list ❚❤❡r❡ ❛r❡ t❤r❡❡ ❜❛s✐❝ ❢✉♥❝t✐♦♥s ❢♦r ✐♥s♣❡❝t✐♥❣ ❧✐sts✳ ◆♦t❡ t❤❡✐r ♣♦❧②♠♦r✲ ♣❤✐❝ t②♣❡s✦ ♥✉❧❧ ✿ ✬❛ ❧✐st ✲❃ ❜♦♦❧ ✐s ❛ ❧✐st ❡♠♣t②❄ ❤❞ ✿ ✬❛ ❧✐st ✲❃ ✬❛ ❤❡❛❞ ♦❢ ❛ ♥♦♥✲❡♠♣t② ❧✐st t❧ ✿ ✬❛ ❧✐st ✲❃ ✬❛ ❧✐st t❛✐❧ ♦❢ ❛ ♥♦♥✲❡♠♣t② ❧✐st ❚❤❡ ❡♠♣t② ❧✐st ❤❛s ♥❡✐t❤❡r ❤❡❛❞ ♥♦r t❛✐❧✳ ❆♣♣❧②✐♥❣ ❡✐t❤❡r ♦♣❡r❛t✐♦♥ t♦ ♥✐❧ ✐s ❛♥ ❡rr♦r✖str✐❝t❧② s♣❡❛❦✐♥❣✱ ❛♥ ❡①❝❡♣t✐♦♥ ✳ ❚❤❡ ❢✉♥❝t✐♦♥ ♥✉❧❧ ❝❛♥ ❜❡ ✉s❡❞ t♦ ❝❤❡❝❦ ❢♦r t❤❡ ❡♠♣t② ❧✐st ❜❡❢♦r❡ ❛♣♣❧②✐♥❣ ❤❞ ♦r t❧ ✳ ❚♦ ❧♦♦❦ ❞❡❡♣ ✐♥s✐❞❡ ❛ ❧✐st ♦♥❡ ❝❛♥ ❛♣♣❧② ❝♦♠❜✐♥❛t✐♦♥s ♦❢ t❤❡s❡ ❢✉♥❝t✐♦♥s✱ ❜✉t t❤✐s st②❧❡ ✐s ❤❛r❞ t♦ r❡❛❞✳ ❋♦rt✉♥❛t❡❧②✱ ✐t ✐s s❡❧❞♦♠ ♥❡❝❡ss❛r② ❜❡❝❛✉s❡ ♦❢ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣ ✳ ❚❤❡ ❞❡❝❧❛r❛t✐♦♥ ♦❢ ♥✉❧❧ ❛❜♦✈❡ ❤❛s t✇♦ ❝❧❛✉s❡s✿ ♦♥❡ ❢♦r t❤❡ ❡♠♣t② ❧✐st ✭❢♦r ✇❤✐❝❤ ✐t r❡t✉r♥s tr✉❡ ✮ ❛♥❞ ♦♥❡ ❢♦r ♥♦♥✲❡♠♣t② ❧✐sts ✭❢♦r ✇❤✐❝❤ ✐t r❡t✉r♥s ❢❛❧s❡ ✮✳ ❚❤❡ ❞❡❝❧❛r❛t✐♦♥ ♦❢ ❤❞ ❛❜♦✈❡ ❤❛s ♦♥❧② ♦♥❡ ❝❧❛✉s❡✱ ❢♦r ♥♦♥✲❡♠♣t② ❧✐sts✳ ❚❤❡② ❤❛✈❡ t❤❡ ❢♦r♠ ①✿✿❧ ❛♥❞ t❤❡ ❢✉♥❝t✐♦♥ r❡t✉r♥s ① ✱ ✇❤✐❝❤ ✐s t❤❡ ❤❡❛❞✳ ▼▲ ♣r✐♥ts ❛ ✇❛r♥✐♥❣ t♦ t❡❧❧ ✉s t❤❛t ❝❛❧❧✐♥❣ t❤❡ ❢✉♥❝t✐♦♥ ❝♦✉❧❞ r❛✐s❡ ❡①❝❡♣t✐♦♥ ▼❛t❝❤ ✱ ✇❤✐❝❤ ✐♥❞✐❝❛t❡s ❢❛✐❧✉r❡ ♦❢ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✳ ❚❤❡ ❞❡❝❧❛r❛t✐♦♥ ♦❢ t❧ ✐s ♦♠✐tt❡❞ ❜❡❝❛✉s❡ ✐t ✐s s✐♠✐❧❛r t♦ ❤❞ ✳ ■♥st❡❛❞✱ t❤❡r❡ ✐s ❛♥ ❡①❛♠♣❧❡ ♦❢ ❛♣♣❧②✐♥❣ t❧ ✳

  37. ■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✾ Computing the Length of a List fun nlength [] = 0 | nlength (x::xs) = 1 + nlength xs; > val nlength = fn: ’a list -> int Slide 404 nlength [ a, b, c ] ⇒ 1 + nlength [ b, c ] ⇒ 1 + (1 + nlength [ c ]) ⇒ 1 + (1 + (1 + nlength [])) ⇒ 1 + (1 + (1 + 0)) ⇒ . . . ⇒ 3 ▼♦st ❧✐st ♣r♦❝❡ss✐♥❣ ✐♥✈♦❧✈❡s r❡❝✉rs✐♦♥✳ ❚❤✐s ✐s ❛ s✐♠♣❧❡ ❡①❛♠♣❧❡❀ ♣❛tt❡r♥s ❝❛♥ ❜❡ ♠♦r❡ ❝♦♠♣❧❡①✳ ❖❜s❡r✈❡ t❤❡ ✉s❡ ♦❢ ❛ ✈❡rt✐❝❛❧ ❜❛r ✭ ⑤ ✮ t♦ s❡♣❛r❛t❡ t❤❡ ❢✉♥❝t✐♦♥✬s ❝❧❛✉s❡s✳ ❲❡ ❤❛✈❡ ♦♥❡ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ t❤❛t ❤❛♥❞❧❡s t✇♦ ❝❛s❡s✳ ❚♦ ✉♥❞❡rst❛♥❞ ✐ts r♦❧❡✱ ❝♦♥s✐❞❡r t❤❡ ❢♦❧❧♦✇✐♥❣ ❢❛✉❧t② ❝♦❞❡✿ ❢✉♥ ♥❧❡♥❣t❤ ❬❪ ❂ ✵❀ ❃ ❲❛r♥✐♥❣✿ ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ✐s ♥♦t ❡①❤❛✉st✐✈❡ ❃ ✈❛❧ ♥❧❡♥❣t❤ ❂ ❢♥✿ ✬❛ ❧✐st ✲❃ ✐♥t ❢✉♥ ♥❧❡♥❣t❤ ✭①✿✿①s✮ ❂ ✶ ✰ ♥❧❡♥❣t❤ ①s❀ ❃ ❲❛r♥✐♥❣✿ ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ✐s ♥♦t ❡①❤❛✉st✐✈❡ ❃ ✈❛❧ ♥❧❡♥❣t❤ ❂ ❢♥✿ ✬❛ ❧✐st ✲❃ ✐♥t ❚❤❡s❡ ❛r❡ t✇♦ ❞❡❝❧❛r❛t✐♦♥s✱ ♥♦t ♦♥❡✳ ❋✐rst ✇❡ ❞❡❝❧❛r❡ ♥❧❡♥❣t❤ t♦ ❜❡ ❛ ❢✉♥❝✲ t✐♦♥ t❤❛t ❤❛♥❞❧❡s ♦♥❧② ❡♠♣t② ❧✐sts✳ ❚❤❡♥ ✇❡ r❡❞❡❝❧❛r❡ ✐t t♦ ❜❡ ❛ ❢✉♥❝t✐♦♥ t❤❛t ❤❛♥❞❧❡s ♦♥❧② ♥♦♥✲❡♠♣t② ❧✐sts❀ ✐t ❝❛♥ ♥❡✈❡r ❞❡❧✐✈❡r ❛ r❡s✉❧t✳ ❲❡ s❡❡ t❤❛t ❛ s❡❝♦♥❞ ❢✉♥ ❞❡❝❧❛r❛t✐♦♥ r❡♣❧❛❝❡s ❛♥② ♣r❡✈✐♦✉s ♦♥❡ r❛t❤❡r t❤❛♥ ❡①t❡♥❞✐♥❣ ✐t t♦ ❝♦✈❡r ♥❡✇ ❝❛s❡s✳ ◆♦✇✱ ❧❡t ✉s r❡t✉r♥ t♦ t❤❡ ❞❡❝❧❛r❛t✐♦♥ s❤♦✇♥ ♦♥ t❤❡ s❧✐❞❡✳ ❚❤❡ ❧❡♥❣t❤ ❢✉♥❝t✐♦♥ ✐s ♣♦❧②♠♦r♣❤✐❝ ✿ ✐t ❛♣♣❧✐❡s t♦ ❛❧❧ ❧✐sts r❡❣❛r❞❧❡ss ♦❢ ❡❧❡♠❡♥t t②♣❡✦ ▼♦st ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❧❛❝❦ s✉❝❤ ✢❡①✐❜✐❧✐t②✳ ❯♥❢♦rt✉♥❛t❡❧②✱ t❤✐s ❧❡♥❣t❤ ❝♦♠♣✉t❛t✐♦♥ ✐s ♥❛ï✈❡ ❛♥❞ ✇❛st❡❢✉❧✳ ▲✐❦❡ ♥s✉♠ ✐♥ ▲❡❝t✳ ✷✱ ✐t ✐s ♥♦t t❛✐❧✲r❡❝✉rs✐✈❡✳ ■t ✉s❡s O ( n ) s♣❛❝❡✱ ✇❤❡r❡ n ✐s t❤❡ ❧❡♥❣t❤ ♦❢ ✐ts ✐♥♣✉t✳ ❆s ✉s✉❛❧✱ t❤❡ s♦❧✉t✐♦♥ ✐s t♦ ❛❞❞ ❛♥ ❛❝❝✉♠✉❧❛t✐♥❣ ❛r❣✉♠❡♥t✳

  38. ■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✵ Efficiently Computing the Length of a List fun addlen (n, [ ]) = n | addlen (n, x::xs) = addlen (n+1, xs); > val addlen = fn: int * ’a list -> int Slide 405 addlen (0 , [ a, b, c ]) ⇒ addlen (1 , [ b, c ]) ⇒ addlen (2 , [ c ]) ⇒ addlen (3 , []) ⇒ 3 P❛tt❡r♥s ❝❛♥ ❜❡ ❛s ❝♦♠♣❧✐❝❛t❡❞ ❛s ✇❡ ❧✐❦❡✳ ❍❡r❡✱ t❤❡ t✇♦ ♣❛tt❡r♥s ❛r❡ ✭♥✱❬❪✮ ❛♥❞ ✭♥✱①✿✿①s✮ ✳ ❋✉♥❝t✐♦♥ ❛❞❞❧❡♥ ✐s ❛❣❛✐♥ ♣♦❧②♠♦r♣❤✐❝✳ ■ts t②♣❡ ♠❡♥t✐♦♥s t❤❡ ✐♥t❡❣❡r ❛❝❝✉♠✉❧❛t♦r✳ ◆♦✇ ✇❡ ♠❛② ❞❡❝❧❛r❡ ❛♥ ❡✣❝✐❡♥t ❧❡♥❣t❤ ❢✉♥❝t✐♦♥✳ ■t ✐s s✐♠♣❧② ❛ ✇r❛♣♣❡r ❢♦r ❛❞❞❧❡♥ ✱ s✉♣♣❧②✐♥❣ ③❡r♦ ❛s t❤❡ ✐♥✐t✐❛❧ ✈❛❧✉❡ ♦❢ ♥ ✳ ❢✉♥ ❧❡♥❣t❤ ①s ❂ ❛❞❞❧❡♥✭✵✱①s✮❀ ❃ ✈❛❧ ❧❡♥❣t❤ ❂ ❢♥ ✿ ✬❛ ❧✐st ✲❃ ✐♥t ❚❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧s ❞♦ ♥♦t ♥❡st✿ t❤✐s ✈❡rs✐♦♥ ✐s ✐t❡r❛t✐✈❡✳ ■t t❛❦❡s O (1) s♣❛❝❡✳ ❖❜✈✐♦✉s❧② ✐ts t✐♠❡ r❡q✉✐r❡♠❡♥t ✐s O ( n ) ❜❡❝❛✉s❡ ✐t t❛❦❡s ❛t ❧❡❛st n st❡♣s t♦ ✜♥❞ t❤❡ ❧❡♥❣t❤ ♦❢ ❛♥ n ✲❡❧❡♠❡♥t ❧✐st✳

  39. ■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✶ Append: List Concatenation fun append([], ys) = ys | append(x::xs, ys) = x :: append(xs,ys); > val append = fn: ’a list * ’a list -> ’a list Slide 406 append ([1 , 2 , 3] , [4]) ⇒ 1 :: append ([2 , 3] , [4]) ⇒ 1 :: (2 :: append ([3] , [4])) ⇒ 1 :: (2 :: (3 :: append ([] , [4]))) ⇒ 1 :: (2 :: (3 :: [4])) ⇒ [1 , 2 , 3 , 4] ❍❡r❡ ✐s ❤♦✇ ❛♣♣❡♥❞ ♠✐❣❤t ❜❡ ❞❡❝❧❛r❡❞✱ ✐❣♥♦r✐♥❣ t❤❡ ❞❡t❛✐❧s ♦❢ ❤♦✇ ❅ ✐s ♠❛❞❡ ❛♥ ✐♥✜① ♦♣❡r❛t♦r✳ ❚❤✐s ❢✉♥❝t✐♦♥ ✐s ❛❧s♦ ♥♦t ✐t❡r❛t✐✈❡✳ ■t s❝❛♥s ✐ts ✜rst ❛r❣✉♠❡♥t✱ s❡ts ✉♣ ❛ str✐♥❣ ♦❢ ❵❝♦♥s✬ ♦♣❡r❛t✐♦♥s ✭ ✿✿ ✮ ❛♥❞ ✜♥❛❧❧② ❞♦❡s t❤❡♠✳ ■t ✉s❡s O ( n ) s♣❛❝❡ ❛♥❞ t✐♠❡✱ ✇❤❡r❡ n ✐s t❤❡ ❧❡♥❣t❤ ♦❢ ✐ts ✜rst ❛r❣✉♠❡♥t✳ ■ts ❝♦sts ❛r❡ ✐♥❞❡♣❡♥❞❡♥t ♦❢ ✐ts s❡❝♦♥❞ ❛r❣✉♠❡♥t✳ ❆♥ ❛❝❝✉♠✉❧❛t✐♥❣ ❛r❣✉♠❡♥t ❝♦✉❧❞ ♠❛❦❡ ✐t ✐t❡r❛t✐✈❡✱ ❜✉t ✇✐t❤ ❝♦♥s✐❞❡r✲ ❛❜❧❡ ❝♦♠♣❧✐❝❛t✐♦♥✳ ❚❤❡ ✐t❡r❛t✐✈❡ ✈❡rs✐♦♥ ✇♦✉❧❞ st✐❧❧ r❡q✉✐r❡ O ( n ) s♣❛❝❡ ❛♥❞ t✐♠❡ ❜❡❝❛✉s❡ ❝♦♥❝❛t❡♥❛t✐♦♥ r❡q✉✐r❡s ❝♦♣②✐♥❣ ❛❧❧ t❤❡ ❡❧❡♠❡♥ts ♦❢ t❤❡ ✜rst ❧✐st✳ ❚❤❡r❡❢♦r❡✱ ✇❡ ❝❛♥♥♦t ❤♦♣❡ ❢♦r ❛s②♠♣t♦t✐❝ ❣❛✐♥s❀ ❛t ❜❡st ✇❡ ❝❛♥ ❞❡❝r❡❛s❡ t❤❡ ❝♦♥st❛♥t ❢❛❝t♦r ✐♥✈♦❧✈❡❞ ✐♥ O ( n ) ✱ ❜✉t ❝♦♠♣❧✐❝❛t✐♥❣ t❤❡ ❝♦❞❡ ✐s ❧✐❦❡❧② t♦ ✐♥❝r❡❛s❡ t❤❛t ❢❛❝t♦r✳ ◆❡✈❡r ❛❞❞ ❛♥ ❛❝❝✉♠✉❧❛t♦r ♠❡r❡❧② ♦✉t ♦❢ ❤❛❜✐t✳ ◆♦t❡ ❛♣♣❡♥❞✬s ♣♦❧②♠♦r♣❤✐❝ t②♣❡✳ ❚✇♦ ❧✐sts ❝❛♥ ❜❡ ❥♦✐♥❡❞ ✐❢ t❤❡✐r ❡❧❡♠❡♥t t②♣❡s ❛❣r❡❡✳

  40. ■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✷ Reversing a List in O ( n 2 ) fun nrev [] = [] | nrev(x::xs) = (nrev xs) @ [x]; > val nrev = fn: ’a list -> ’a list Slide 407 nrev [ a, b, c ] ⇒ nrev [ b, c ] @ [ a ] ⇒ ( nrev [ c ] @ [ b ]) @ [ a ] ⇒ (( nrev [] @ [ c ]) @ [ b ]) @ [ a ] ⇒ (([] @ [ c ]) @ [ b ]) @ [ a ] ⇒ . . . ⇒ [ c, b, a ] ❚❤✐s r❡✈❡rs❡ ❢✉♥❝t✐♦♥ ✐s ❣r♦ss❧② ✐♥❡✣❝✐❡♥t ❞✉❡ t♦ ♣♦♦r ✉s❛❣❡ ♦❢ ❛♣♣❡♥❞✱ ✇❤✐❝❤ ❝♦♣✐❡s ✐ts ✜rst ❛r❣✉♠❡♥t✳ ■❢ ♥r❡✈ ✐s ❣✐✈❡♥ ❛ ❧✐st ♦❢ ❧❡♥❣t❤ n > 0 ✱ t❤❡♥ ❛♣♣❡♥❞ ♠❛❦❡s n − 1 ❝♦♥s❡s t♦ ❝♦♣② t❤❡ r❡✈❡rs❡❞ t❛✐❧✳ ❈♦♥str✉❝t✐♥❣ t❤❡ ❧✐st ❬①❪ ❝❛❧❧s ❝♦♥s ❛❣❛✐♥✱ ❢♦r ❛ t♦t❛❧ ♦❢ n ❝❛❧❧s✳ ❘❡✈❡rs✐♥❣ t❤❡ t❛✐❧ r❡q✉✐r❡s n − 1 ♠♦r❡ ❝♦♥s❡s✱ ❛♥❞ s♦ ❢♦rt❤✳ ❚❤❡ t♦t❛❧ ♥✉♠❜❡r ♦❢ ❝♦♥s❡s ✐s 0 + 1 + 2 + · · · + n = n ( n + 1) / 2 . ❚❤❡ t✐♠❡ ❝♦♠♣❧❡①✐t② ✐s t❤❡r❡❢♦r❡ O ( n 2 ) ✳ ❙♣❛❝❡ ❝♦♠♣❧❡①✐t② ✐s ♦♥❧② O ( n ) ❜❡❝❛✉s❡ t❤❡ ❝♦♣✐❡s ❞♦♥✬t ❛❧❧ ❡①✐st ❛t t❤❡ s❛♠❡ t✐♠❡✳

  41. ■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✸ Reversing a List in O ( n ) fun revApp ([], ys) = ys | revApp (x::xs, ys) = revApp (xs, x::ys); > val revApp = fn: ’a list * ’a list -> ’a list Slide 408 revApp ([ a, b, c ] , []) ⇒ revApp ([ b, c ] , [ a ]) ⇒ revApp ([ c ] , [ b, a ]) ⇒ revApp ([] , [ c, b, a ]) ⇒ [ c, b, a ] ❈❛❧❧✐♥❣ r❡✈❆♣♣ ✭①s✱②s✮ r❡✈❡rs❡s t❤❡ ❡❧❡♠❡♥ts ♦❢ ①s ❛♥❞ ♣r❡♣❡♥❞s t❤❡♠ t♦ ②s ✳ ◆♦✇ ✇❡ ♠❛② ❞❡❝❧❛r❡ ❢✉♥ r❡✈ ①s ❂ r❡✈❆♣♣✭①s✱❬❪✮❀ ❃ ✈❛❧ r❡✈ ❂ ❢♥ ✿ ✬❛ ❧✐st ✲❃ ✬❛ ❧✐st ■t ✐s ❡❛s② t♦ s❡❡ t❤❛t t❤✐s r❡✈❡rs❡ ❢✉♥❝t✐♦♥ ♣❡r❢♦r♠s ❥✉st n ❝♦♥s❡s✱ ❣✐✈❡♥ ❛♥ n ✲❡❧❡♠❡♥t ❧✐st✳ ❋♦r ❜♦t❤ r❡✈❡rs❡ ❢✉♥❝t✐♦♥s✱ ✇❡ ❝♦✉❧❞ ❝♦✉♥t t❤❡ ♥✉♠❜❡r ♦❢ ❝♦♥s❡s ♣r❡❝✐s❡❧②✖♥♦t ❥✉st ✉♣ t♦ ❛ ❝♦♥st❛♥t ❢❛❝t♦r✳ O ♥♦t❛t✐♦♥ ✐s st✐❧❧ ✉s❡❢✉❧ t♦ ❞❡s❝r✐❜❡ t❤❡ ♦✈❡r❛❧❧ r✉♥♥✐♥❣ t✐♠❡✿ t❤❡ t✐♠❡ t❛❦❡♥ ❜② ❛ ❝♦♥s ✈❛r✐❡s ❢r♦♠ ♦♥❡ s②st❡♠ t♦ ❛♥♦t❤❡r✳ ❚❤❡ ❛❝❝✉♠✉❧❛t♦r y ♠❛❦❡s t❤❡ ❢✉♥❝t✐♦♥ ✐t❡r❛t✐✈❡✳ ❇✉t t❤❡ ❣❛✐♥ ✐♥ ❝♦♠✲ ♣❧❡①✐t② ❛r✐s❡s ❢r♦♠ t❤❡ r❡♠♦✈❛❧ ♦❢ ❛♣♣❡♥❞✳ ❘❡♣❧❛❝✐♥❣ ❛♥ ❡①♣❡♥s✐✈❡ ♦♣❡r❛t✐♦♥ ✭❛♣♣❡♥❞✮ ❜② ❛ s❡r✐❡s ♦❢ ❝❤❡❛♣ ♦♣❡r❛t✐♦♥s ✭❝♦♥s✮ ✐s ❝❛❧❧❡❞ r❡❞✉❝t✐♦♥ ✐♥ str❡♥❣t❤ ✱ ❛♥❞ ✐s ❛ ❝♦♠♠♦♥ t❡❝❤♥✐q✉❡ ✐♥ ❝♦♠♣✉t❡r s❝✐❡♥❝❡✳ ■t ♦r✐❣✐♥❛t❡❞ ✇❤❡♥ ♠❛♥② ❝♦♠♣✉t❡rs ❞✐❞ ♥♦t ❤❛✈❡ ❛ ❤❛r❞✇❛r❡ ♠✉❧t✐♣❧② ✐♥str✉❝t✐♦♥❀ t❤❡ s❡r✐❡s ♦❢ ♣r♦❞✲ ✉❝ts i × r ❢♦r i = 0 ✱ ✳ ✳ ✳ ✱ n ❝♦✉❧❞ ♠♦r❡ ❡✣❝✐❡♥t❧② ❜❡ ❝♦♠♣✉t❡❞ ❜② r❡♣❡❛t❡❞ ❛❞❞✐t✐♦♥✳ ❘❡❞✉❝t✐♦♥ ✐♥ str❡♥❣t❤ ❝❛♥ ❜❡ ❞♦♥❡ ✐♥ ✈❛r✐♦✉s ✇❛②s❀ ✇❡ s❤❛❧❧ s❡❡ ♠❛♥② ✐♥st❛♥❝❡s ♦❢ r❡♠♦✈✐♥❣ ❛♣♣❡♥❞✳ ❈♦♥s✐♥❣ t♦ ❛♥ ❛❝❝✉♠✉❧❛t♦r ♣r♦❞✉❝❡s t❤❡ r❡s✉❧t ✐♥ r❡✈❡rs❡✳ ■❢ t❤❛t ❢♦r❝❡s t❤❡ ✉s❡ ♦❢ ❛♥ ❡①tr❛ ❧✐st r❡✈❡rs❛❧ t❤❡♥ t❤❡ ✐t❡r❛t✐✈❡ ❢✉♥❝t✐♦♥ ♠❛② ❜❡ ♠✉❝❤ s❧♦✇❡r t❤❛♥ t❤❡ r❡❝✉rs✐✈❡ ♦♥❡✳

  42. ■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✹ Lists, Strings and Characters #"A" #"\"" character constants . . . "" "B" "Oh, no!" string constants . . . Slide 409 explode ( s ) list of the characters in string s implode ( l ) string made of the characters in list l size ( s ) number of chars in string s s 1 ^ s 2 concatenation of strings s 1 and s 2 ❙tr✐♥❣s ❛r❡ ♣r♦✈✐❞❡❞ ✐♥ ♠♦st ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s t♦ ❛❧❧♦✇ t❡①t ♣r♦✲ ❝❡ss✐♥❣✳ ❆t ❛ ❜❛r❡ ♠✐♥✐♠✉♠✱ ♥✉♠❜❡rs ♠✉st ❜❡ ❝♦♥✈❡rt❡❞ t♦ ♦r ❢r♦♠ ❛ t❡①t✉❛❧ r❡♣r❡s❡♥t❛t✐♦♥✳ Pr♦❣r❛♠s ✐ss✉❡ t❡①t✉❛❧ ♠❡ss❛❣❡s t♦ ✉s❡rs ❛♥❞ ❛♥❛❧②③❡ t❤❡✐r r❡s♣♦♥s❡s✳ ❙tr✐♥❣s ❛r❡ ❡ss❡♥t✐❛❧ ✐♥ ♣r❛❝t✐❝❡✱ ❜✉t t❤❡② ❜r✐♥❣ ✉♣ ❢❡✇ ✐ss✉❡s r❡❧❡✈❛♥t t♦ t❤✐s ❝♦✉rs❡✳ ❚❤❡ ❢✉♥❝t✐♦♥s ❡①♣❧♦❞❡ ❛♥❞ ✐♠♣❧♦❞❡ ❝♦♥✈❡rt ❜❡t✇❡❡♥ str✐♥❣s ❛♥❞ ❧✐sts ♦❢ ❝❤❛r❛❝t❡rs✳ ■♥ ❛ ❢❡✇ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✱ str✐♥❣s s✐♠♣❧② ❛r❡ ❧✐sts ♦❢ ❝❤❛r✲ ❛❝t❡rs✱ ❜✉t t❤✐s ✐s ♣♦♦r ❞❡s✐❣♥✳ ❙tr✐♥❣s ❛r❡ ❛♥ ❛❜str❛❝t ❝♦♥❝❡♣t ✐♥ t❤❡♠s❡❧✈❡s✳ ❚r❡❛t✐♥❣ t❤❡♠ ❛s ❧✐sts ❧❡❛❞s t♦ ❝❧✉♠s② ❛♥❞ ✐♥❡✣❝✐❡♥t ❝♦❞❡✳ ❙✐♠✐❧❛r❧②✱ ❝❤❛r❛❝t❡rs ❛r❡ ♥♦t str✐♥❣s ♦❢ s✐③❡ ♦♥❡✱ ❜✉t ❛r❡ ❛ ♣r✐♠✐t✐✈❡ ❝♦♥✲ ❝❡♣t✳ ❈❤❛r❛❝t❡r ❝♦♥st❛♥ts ✐♥ ▼▲ ❤❛✈❡ t❤❡ ❢♦r♠ ★✧ c ✧ ✱ ✇❤❡r❡ c ✐s ❛♥② ❝❤❛r❛❝✲ t❡r✳ ❋♦r ❡①❛♠♣❧❡✱ t❤❡ ❝♦♠♠❛ ❝❤❛r❛❝t❡r ✐s ★✧✱✧ ✳ ■♥ ❛❞❞✐t✐♦♥ t♦ t❤❡ ♦♣❡r❛t♦rs ❞❡s❝r✐❜❡❞ ❛❜♦✈❡✱ t❤❡ r❡❧❛t✐♦♥s ❁ ❁❂ ❃ ❃❂ ✇♦r❦ ❢♦r str✐♥❣s ❛♥❞ ②✐❡❧❞ ❛❧♣❤❛❜❡t✐❝ ♦r❞❡r ✭♠♦r❡ ♣r❡❝✐s❡❧②✱ ❧❡①✐❝♦❣r❛♣❤✐❝ ♦r❞❡r ✇✐t❤ r❡s♣❡❝t t♦ ❆❙❈■■ ❝❤❛r❛❝t❡r ❝♦❞❡s✮✳

  43. ■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✺ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✻✾✕✽✵✳ ❈♦❞❡ ❛ r❡❝✉rs✐✈❡ ❢✉♥❝t✐♦♥ t♦ ❝♦♠♣✉t❡ t❤❡ s✉♠ ♦❢ ❛ ❧✐st✬s ❊①❡r❝✐s❡ ✹✳✶ ❡❧❡♠❡♥ts✳ ❚❤❡♥ ❝♦❞❡ ❛♥ ✐t❡r❛t✐✈❡ ✈❡rs✐♦♥ ❛♥❞ ❝♦♠♠❡♥t ♦♥ t❤❡ ✐♠♣r♦✈❡♠❡♥t ✐♥ ❡✣❝✐❡♥❝②✳

  44. ❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✻ List Utilities: take and drop Removing the first i elements fun take ([], _) = [] | take (x::xs, i) = if i>0 Slide 501 then x :: take(xs, i-1) else []; fun drop ([], _) = [] | drop (x::xs, i) = if i>0 then drop(xs,i-1) else x::xs; ❚❤✐s ❧❡❝t✉r❡ ❡①❛♠✐♥❡s ♠♦r❡ ❧✐st ✉t✐❧✐t✐❡s✱ ✐❧❧✉str❛t✐♥❣ ♠♦r❡ ♣❛tt❡r♥s ♦❢ r❡❝✉rs✐♦♥✱ ❛♥❞ ❝♦♥❝❧✉❞❡s ✇✐t❤ ❛ s♠❛❧❧ ♣r♦❣r❛♠ ❢♦r ♠❛❦✐♥❣ ❝❤❛♥❣❡✳ ❚❤❡ ❢✉♥❝t✐♦♥s t❛❦❡ ❛♥❞ ❞r♦♣ ❞✐✈✐❞❡ ❛ ❧✐st ✐♥t♦ ♣❛rts✱ r❡t✉r♥✐♥❣ ♦r ❞✐s✲ ❝❛r❞✐♥❣ t❤❡ ✜rst i ❡❧❡♠❡♥ts✳ xs = [ x 0 , . . . , x i − 1 , x i , . . . , x n − 1 ] � �� � � �� � take ( xs, i ) drop ( xs, i ) ❆♣♣❧✐❝❛t✐♦♥s ♦❢ t❛❦❡ ❛♥❞ ❞r♦♣ ✇✐❧❧ ❛♣♣❡❛r ✐♥ ❢✉t✉r❡ ❧❡❝t✉r❡s✳ ❚②♣✐❝❛❧❧②✱ t❤❡② ❞✐✈✐❞❡ ❛ ❝♦❧❧❡❝t✐♦♥ ♦❢ ✐t❡♠s ✐♥t♦ ❡q✉❛❧ ♣❛rts ❢♦r r❡❝✉rs✐✈❡ ♣r♦❝❡ss✐♥❣✳ ❚❤❡ s♣❡❝✐❛❧ ♣❛tt❡r♥ ✈❛r✐❛❜❧❡ ❴ ❛♣♣❡❛rs ✐♥ ❜♦t❤ ❢✉♥❝t✐♦♥s✳ ❚❤✐s ✇✐❧❞❝❛r❞ ♣❛tt❡r♥ ♠❛t❝❤❡s ❛♥②t❤✐♥❣✳ ❲❡ ❝♦✉❧❞ ❤❛✈❡ ✇r✐tt❡♥ ✐ ✐♥ ❜♦t❤ ♣♦s✐t✐♦♥s✱ ❜✉t t❤❡ ✇✐❧❞❝❛r❞ r❡♠✐♥❞s ✉s t❤❛t t❤❡ r❡❧❡✈❛♥t ❝❧❛✉s❡ ✐❣♥♦r❡s t❤✐s ❛r❣✉♠❡♥t✳ ❋✉♥❝t✐♦♥ t❛❦❡ ✐s ♥♦t ✐t❡r❛t✐✈❡✱ ❜✉t ♠❛❦✐♥❣ ✐t s♦ ✇♦✉❧❞ ♥♦t ✐♠♣r♦✈❡ ✐ts ❡✣❝✐❡♥❝②✳ ❚❤❡ t❛s❦ r❡q✉✐r❡s ❝♦♣②✐♥❣ ✉♣ t♦ i ❧✐st ❡❧❡♠❡♥ts✱ ✇❤✐❝❤ ♠✉st t❛❦❡ O ( i ) s♣❛❝❡ ❛♥❞ t✐♠❡✳ ❋✉♥❝t✐♦♥ ❞r♦♣ s✐♠♣❧② s❦✐♣s ♦✈❡r i ❧✐st ❡❧❡♠❡♥ts✳ ❚❤✐s r❡q✉✐r❡s O ( i ) t✐♠❡ ❜✉t ♦♥❧② ❝♦♥st❛♥t s♣❛❝❡✳ ■t ✐s ✐t❡r❛t✐✈❡ ❛♥❞ ♠✉❝❤ ❢❛st❡r t❤❛♥ t❛❦❡ ✳ ❇♦t❤ ❢✉♥❝t✐♦♥s ✉s❡ O ( i ) t✐♠❡✱ ❜✉t s❦✐♣♣✐♥❣ ❡❧❡♠❡♥ts ✐s ❢❛st❡r t❤❛♥ ❝♦♣②✐♥❣ t❤❡♠✿ ❞r♦♣ ✬s ❝♦♥st❛♥t ❢❛❝t♦r ✐s s♠❛❧❧❡r✳ ❇♦t❤ ❢✉♥❝t✐♦♥s t❛❦❡ ❛ ❧✐st ❛♥❞ ❛♥ ✐♥t❡❣❡r✱ r❡t✉r♥✐♥❣ ❛ ❧✐st ♦❢ t❤❡ s❛♠❡ t②♣❡✳ ❙♦ t❤❡✐r t②♣❡ ✐s ✬❛ ❧✐st ✯ ✐♥t ✲❃ ✬❛ ❧✐st ✳

  45. ❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✼ Linear Search find x in list [ x 1 , . . . , x n ] by comparing with each element Slide 502 obviously O ( n ) TIME simple & general ordered searching needs only O (log n ) indexed lookup needs only O (1) ▲✐♥❡❛r s❡❛r❝❤ ✐s t❤❡ ♦❜✈✐♦✉s ✇❛② t♦ ✜♥❞ ❛ ❞❡s✐r❡❞ ✐t❡♠ ✐♥ ❛ ❝♦❧❧❡❝t✐♦♥✿ s✐♠♣❧② ❧♦♦❦ t❤r♦✉❣❤ ❛❧❧ t❤❡ ✐t❡♠s✱ ♦♥❡ ❛t ❛ t✐♠❡✳ ■❢ x ✐s ✐♥ t❤❡ ❧✐st✱ t❤❡♥ ✐t ✇✐❧❧ ❜❡ ❢♦✉♥❞ ✐♥ n/ 2 st❡♣s ♦♥ ❛✈❡r❛❣❡✱ ❛♥❞ ❡✈❡♥ t❤❡ ✇♦rst ❝❛s❡ ✐s ♦❜✈✐♦✉s❧② O ( n ) ✳ ▲❛r❣❡ ❝♦❧❧❡❝t✐♦♥s ♦❢ ❞❛t❛ ❛r❡ ✉s✉❛❧❧② ♦r❞❡r❡❞ ♦r ✐♥❞❡①❡❞ s♦ t❤❛t ✐t❡♠s ❝❛♥ ❜❡ ❢♦✉♥❞ ✐♥ O (log n ) t✐♠❡✱ ✇❤✐❝❤ ✐s ❡①♣♦♥❡♥t✐❛❧❧② ❜❡tt❡r t❤❛♥ O ( n ) ✳ ❊✈❡♥ O (1) ✐s ❛❝❤✐❡✈❛❜❧❡ ✭✉s✐♥❣ ❛ ❤❛s❤ t❛❜❧❡ ✮✱ t❤♦✉❣❤ s✉❜❥❡❝t t♦ t❤❡ ✉s✉❛❧ ♣r♦✈✐s♦ t❤❛t ♠❛❝❤✐♥❡ ❧✐♠✐ts ❛r❡ ♥♦t ❡①❝❡❡❞❡❞✳ ❊✣❝✐❡♥t ✐♥❞❡①✐♥❣ ♠❡t❤♦❞s ❛r❡ ♦❢ ♣r✐♠❡ ✐♠♣♦rt❛♥❝❡✿ ❝♦♥s✐❞❡r ❲❡❜ s❡❛r❝❤ ❡♥❣✐♥❡s✳ ◆❡✈❡rt❤❡❧❡ss✱ ❧✐♥❡❛r s❡❛r❝❤ ✐s ♦❢t❡♥ ✉s❡❞ t♦ s❡❛r❝❤ s♠❛❧❧ ❝♦❧❧❡❝t✐♦♥s ❜❡❝❛✉s❡ ✐t ✐s s♦ s✐♠♣❧❡ ❛♥❞ ❣❡♥❡r❛❧✱ ❛♥❞ ✐t ✐s t❤❡ st❛rt✐♥❣ ♣♦✐♥t ❢♦r ❜❡tt❡r ❛❧❣♦r✐t❤♠s✳

  46. ❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✽ Types with Equality The membership test has a strange polymorphic type. Slide 503 fun member(x, []) = false | member(x, y::l) = (x=y) orelse member(x,l); > val member = fn : ’’a * ’’a list -> bool Here, ”a stands for any equality type . Equality testing is OK for integers but NOT for functions. ❆❧❧ t❤❡ ❧✐st ❢✉♥❝t✐♦♥s ✇❡ ❤❛✈❡ ❡♥❝♦✉♥t❡r❡❞ ✉♣ t♦ ♥♦✇ ❤❛✈❡ ❜❡❡♥ ♣♦❧②♠♦r✲ ♣❤✐❝ ✱ ✇♦r❦✐♥❣ ❢♦r ❧✐sts ♦❢ ❛♥② t②♣❡✳ ❋✉♥❝t✐♦♥ ♠❡♠❜❡r ✉s❡s ❧✐♥❡❛r s❡❛r❝❤ t♦ r❡♣♦rt ✇❤❡t❤❡r ♦r ♥♦t ① ♦❝❝✉rs ✐♥ ❧ ✳ ■ts ♣♦❧②♠♦r♣❤✐s♠ ✐s r❡str✐❝t❡❞ t♦ t❤❡ s♦✲❝❛❧❧❡❞ ❡q✉❛❧✐t② t②♣❡s ✳ ❚❤❡s❡ ✐♥❝❧✉❞❡ ✐♥t❡❣❡rs✱ str✐♥❣s✱ ❜♦♦❧❡❛♥s✱ ❛♥❞ t✉♣❧❡s ♦r ❧✐sts ♦❢ ♦t❤❡r ❡q✉❛❧✐t② t②♣❡s✳ ❊q✉❛❧✐t② t❡st✐♥❣ ✐s ♥♦t ❛✈❛✐❧❛❜❧❡ ❢♦r ❡✈❡r② t②♣❡✱ ❤♦✇❡✈❡r✳ ❋✉♥❝t✐♦♥s ❛r❡ ✈❛❧✉❡s ✐♥ ▼▲✱ ❛♥❞ t❤❡r❡ ✐s ♥♦ ✇❛② ♦❢ ❝♦♠♣❛r✐♥❣ t✇♦ ❢✉♥❝t✐♦♥s t❤❛t ✐s ❜♦t❤ ♣r❛❝t✐❝❛❧ ❛♥❞ ♠❡❛♥✐♥❣❢✉❧✳ ❆❜str❛❝t t②♣❡s ❝❛♥ ❜❡ ❞❡❝❧❛r❡❞ ✐♥ ▼▲✱ ❤✐❞✐♥❣ t❤❡✐r ✐♥t❡r♥❛❧ r❡♣r❡s❡♥t❛t✐♦♥✱ ✐♥❝❧✉❞✐♥❣ ✐ts ❡q✉❛❧✐t② t❡st✳ ❊q✉❛❧✐t② ✐s ♥♦t ❡✈❡♥ ❛❧❧♦✇❡❞ ❢♦r t②♣❡ r❡❛❧ ✱ t❤♦✉❣❤ s♦♠❡ ▼▲ s②st❡♠s ✐❣♥♦r❡ t❤✐s✳ ❲❡ s❤❛❧❧ ❞✐s❝✉ss ❢✉♥❝t✐♦♥ ✈❛❧✉❡s ❛♥❞ ❛❜str❛❝t t②♣❡s ❧❛t❡r✳ ■❢ ❛ ❢✉♥❝t✐♦♥✬s t②♣❡ ❝♦♥t❛✐♥s ❡q✉❛❧✐t② t②♣❡ ✈❛r✐❛❜❧❡s ✱ s✉❝❤ ❛s ✑❛ ✱ ✑❜ ✱ t❤❡♥ ✐t ✉s❡s ♣♦❧②♠♦r♣❤✐❝ ❡q✉❛❧✐t② t❡st✐♥❣✳

  47. ❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✾ Equality Polymorphism fun inter([], ys) = [] | inter(x::xs, ys) = Slide 504 if member(x,ys) then x::inter(xs, ys) else inter(xs, ys); > val inter = fn: ’’a list * ’’a list -> ’’a list ML notices that inter uses equality indirectly , by member . ML will OBJECT if we apply these functions to non-equality types. ❋✉♥❝t✐♦♥ ✐♥t❡r ❝♦♠♣✉t❡s t❤❡ ❵✐♥t❡rs❡❝t✐♦♥✬ ♦❢ t✇♦ ❧✐sts✱ r❡t✉r♥✐♥❣ t❤❡ ❧✐st ♦❢ ❡❧❡♠❡♥ts ❝♦♠♠♦♥ t♦ ❜♦t❤✳ ■t ❝❛❧❧s ♠❡♠❜❡r ✳ ❚❤❡ ❡q✉❛❧✐t② t②♣❡ ✈❛r✐❛❜❧❡s ♣r♦♣❛❣❛t❡✿ t❤❡ ✐♥t❡rs❡❝t✐♦♥ ❢✉♥❝t✐♦♥ ❛❧s♦ ❤❛s t❤❡♠ ❡✈❡♥ t❤♦✉❣❤ ✐ts ✉s❡ ♦❢ ❡q✉❛❧✐t② ✐s ✐♥❞✐r❡❝t✳ ❚r②✐♥❣ t♦ ❛♣♣❧② ♠❡♠❜❡r ♦r ✐♥t❡r t♦ ❛ ❧✐st ♦❢ ❢✉♥❝t✐♦♥s ❝❛✉s❡s ▼▲ t♦ ❝♦♠♣❧❛✐♥ ♦❢ ❛ t②♣❡ ❡rr♦r ✳ ■t ❞♦❡s s♦ ❛t ❝♦♠♣✐❧❡ t✐♠❡ ✿ ✐t ❞❡t❡❝ts t❤❡ ❡rr♦rs ❜② t②♣❡s ❛❧♦♥❡✱ ✇✐t❤♦✉t ❡①❡❝✉t✐♥❣ t❤❡ ♦✛❡♥❞✐♥❣ ❝♦❞❡✳ ❊q✉❛❧✐t② ♣♦❧②♠♦r♣❤✐s♠ ✐s ❛ ❝♦♥t❡♥t✐♦✉s ❢❡❛t✉r❡✳ ❙♦♠❡ r❡s❡❛r❝❤❡rs ❝♦♠✲ ♣❧❛✐♥ t❤❛t ✐t ♠❛❦❡s ▼▲ t♦♦ ❝♦♠♣❧✐❝❛t❡❞ ❛♥❞ ❧❡❛❞s ♣r♦❣r❛♠♠❡rs t♦ ✉s❡ ❧✐♥❡❛r s❡❛r❝❤ ❡①❝❡ss✐✈❡❧②✳ ❚❤❡ ❢✉♥❝t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡ ❍❛s❦❡❧❧ ❣❡♥❡r❛❧✲ ✐③❡s t❤❡ ❝♦♥❝❡♣t✱ ❛❧❧♦✇✐♥❣ ♣r♦❣r❛♠♠❡rs t♦ ✐♥tr♦❞✉❝❡ ♥❡✇ ❝❧❛ss❡s ♦❢ t②♣❡s s✉♣♣♦rt✐♥❣ ❛♥② ❞❡s✐r❡❞ ❝♦❧❧❡❝t✐♦♥ ♦❢ ♦♣❡r❛t✐♦♥s✳

  48. ❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✵ Building a List of Pairs fun zip (x::xs,y::ys) = (x,y) :: zip(xs,ys) | zip _ = []; Slide 505 � [ x 1 , . . . , x n ] �− → [( x 1 , y 1 ) , . . . , ( x n , y n )] [ y 1 , . . . , y n ] The wildcard pattern ( _ ) catches empty lists. T HE PATTERNS ARE TRIED IN ORDER . ❆ ❧✐st ♦❢ ♣❛✐rs ♦❢ t❤❡ ❢♦r♠ [( x 1 , y 1 ) , . . . , ( x n , y n )] ❛ss♦❝✐❛t❡s ❡❛❝❤ x i ✇✐t❤ y i ✳ ❈♦♥❝❡♣t✉❛❧❧②✱ ❛ t❡❧❡♣❤♦♥❡ ❞✐r❡❝t♦r② ❝♦✉❧❞ ❜❡ r❡❣❛r❞❡❞ ❛s s✉❝❤ ❛ ❧✐st✱ ✇❤❡r❡ x i r❛♥❣❡s ♦✈❡r ♥❛♠❡s ❛♥❞ y i ♦✈❡r t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ t❡❧❡♣❤♦♥❡ ♥✉♠❜❡r✳ ▲✐♥❡❛r s❡❛r❝❤ ✐♥ s✉❝❤ ❛ ❧✐st ❝❛♥ ✜♥❞ t❤❡ y i ❛ss♦❝✐❛t❡❞ ✇✐t❤ ❛ ❣✐✈❡♥ x i ✱ ♦r ✈✐❝❡ ✈❡rs❛✖ ✈❡r② s❧♦✇❧②✳ ■♥ ♦t❤❡r ❝❛s❡s✱ t❤❡ ( x i , y i ) ♣❛✐rs ♠✐❣❤t ❤❛✈❡ ❜❡❡♥ ❣❡♥❡r❛t❡❞ ❜② ❛♣♣❧②✐♥❣ ❛ ❢✉♥❝t✐♦♥ t♦ t❤❡ ❡❧❡♠❡♥ts ♦❢ ❛♥♦t❤❡r ❧✐st [ z 1 , . . . , z n ] ✳ ❚❤❡ ❢✉♥❝t✐♦♥s ③✐♣ ❛♥❞ ✉♥③✐♣ ❜✉✐❧❞ ❛♥❞ t❛❦❡ ❛♣❛rt ❧✐sts ♦❢ ♣❛✐rs✿ ③✐♣ ♣❛✐rs ✉♣ ❝♦rr❡s♣♦♥❞✐♥❣ ❧✐st ❡❧❡♠❡♥ts ❛♥❞ ✉♥③✐♣ ✐♥✈❡rts t❤✐s ♦♣❡r❛t✐♦♥✳ ❚❤❡✐r t②♣❡s r❡✢❡❝t ✇❤❛t t❤❡② ❞♦✿ ③✐♣ ✿ ✭✬❛ ❧✐st ✯ ✬❜ ❧✐st✮ ✲❃ ✭✬❛ ✯ ✬❜✮ ❧✐st ✉♥③✐♣ ✿ ✭✬❛ ✯ ✬❜✮ ❧✐st ✲❃ ✭✬❛ ❧✐st ✯ ✬❜ ❧✐st✮ ■❢ t❤❡ ❧✐sts ❛r❡ ♦❢ ✉♥❡q✉❛❧ ❧❡♥❣t❤✱ ③✐♣ ❞✐s❝❛r❞s s✉r♣❧✉s ✐t❡♠s ❛t t❤❡ ❡♥❞ ♦❢ t❤❡ ❧♦♥❣❡r ❧✐st✳ ■ts ✜rst ♣❛tt❡r♥ ♦♥❧② ♠❛t❝❤❡s ❛ ♣❛✐r ♦❢ ♥♦♥✲❡♠♣t② ❧✐sts✳ ❚❤❡ s❡❝♦♥❞ ♣❛tt❡r♥ ✐s ❥✉st ❛ ✇✐❧❞❝❛r❞ ❛♥❞ ❝♦✉❧❞ ♠❛t❝❤ ❛♥②t❤✐♥❣✳ ▼▲ tr✐❡s t❤❡ ❝❧❛✉s❡s ✐♥ t❤❡ ♦r❞❡r ❣✐✈❡♥✱ s♦ t❤❡ ✜rst ♣❛tt❡r♥ ✐s tr✐❡❞ ✜rst✳ ❚❤❡ s❡❝♦♥❞ ♦♥❧② ❣❡ts ❛r❣✉♠❡♥ts ✇❤❡r❡ ❛t ❧❡❛st ♦♥❡ ♦❢ t❤❡ ❧✐sts ✐s ❡♠♣t②✳

  49. ❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✶ Building a Pair of Results fun unzip [] = ([],[]) | unzip ((x,y)::pairs) = let val (xs,ys) = unzip pairs Slide 506 in (x::xs, y::ys) end; fun revUnzip ([], xs, ys) = (xs,ys) | revUnzip ((x,y)::pairs, xs, ys) = revUnzip(pairs, x::xs, y::ys); ●✐✈❡♥ ❛ ❧✐st ♦❢ ♣❛✐rs✱ ✉♥③✐♣ ❤❛s t♦ ❜✉✐❧❞ t✇♦ ❧✐sts ♦❢ r❡s✉❧ts✱ ✇❤✐❝❤ ✐s ❛✇❦✇❛r❞ ✉s✐♥❣ r❡❝✉rs✐♦♥✳ ❚❤❡ ✈❡rs✐♦♥ s❤♦✇♥ ❛❜♦✉t ✉s❡s t❤❡ ❧♦❝❛❧ ❞❡❝❧❛r❛t✐♦♥ ❧❡t D ✐♥ E ❡♥❞ ✱ ✇❤❡r❡ D ❝♦♥s✐sts ♦❢ ❞❡❝❧❛r❛t✐♦♥s ❛♥❞ E ✐s t❤❡ ❡①♣r❡ss✐♦♥ t❤❛t ❝❛♥ ✉s❡ t❤❡♠✳ ◆♦t❡ ❡s♣❡❝✐❛❧❧② t❤❡ ❞❡❝❧❛r❛t✐♦♥ ✈❛❧ ✭①s✱②s✮ ❂ ✉♥③✐♣ ♣❛✐rs ✇❤✐❝❤ ❜✐♥❞s ①s ❛♥❞ ②s t♦ t❤❡ r❡s✉❧ts ♦❢ t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧✳ ■♥ ❣❡♥❡r❛❧✱ t❤❡ ❞❡❝❧❛r❛t✐♦♥ ✈❛❧ P ❂ E ♠❛t❝❤❡s t❤❡ ♣❛tt❡r♥ P ❛❣❛✐♥st t❤❡ ✈❛❧✉❡ ♦❢ ❡①♣r❡s✲ s✐♦♥ E ✳ ■t ❜✐♥❞s ❛❧❧ t❤❡ ✈❛r✐❛❜❧❡s ✐♥ P t♦ t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ ✈❛❧✉❡s✳ ❍❡r❡ ✐s ✈❡rs✐♦♥ ♦❢ ✉♥③✐♣ t❤❛t r❡♣❧❛❝❡s t❤❡ ❧♦❝❛❧ ❞❡❝❧❛r❛t✐♦♥ ❜② ❛ ❢✉♥❝t✐♦♥ ✭ ❝♦♥s♣❛✐r ✮ ❢♦r t❛❦✐♥❣ ❛♣❛rt t❤❡ ♣❛✐r ♦❢ ❧✐sts ✐♥ t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧✳ ■t ❞❡✜♥❡s t❤❡ s❛♠❡ ❝♦♠♣✉t❛t✐♦♥ ❛s t❤❡ ♣r❡✈✐♦✉s ✈❡rs✐♦♥ ♦❢ ③✐♣ ❛♥❞ ✐s ♣♦ss✐❜❧② ❝❧❡❛r❡r✱ ❜✉t ♥♦t ❡✈❡r② ❧♦❝❛❧ ❞❡❝❧❛r❛t✐♦♥ ❝❛♥ ❜❡ ❡❧✐♠✐♥❛t❡❞ ❛s ❡❛s✐❧②✳ ❢✉♥ ❝♦♥s♣❛✐r ✭✭①✱②✮✱ ✭①s✱②s✮✮ ❂ ✭①✿✿①s✱ ②✿✿②s✮❀ ❢✉♥ ✉♥③✐♣ ❬❪ ❂ ✭❬❪✱❬❪✮ ⑤ ✉♥③✐♣✭①②✿✿♣❛✐rs✮ ❂ ❝♦♥s♣❛✐r✭①②✱ ✉♥③✐♣ ♣❛✐rs✮❀ ▼❛❦✐♥❣ t❤❡ ❢✉♥❝t✐♦♥ ✐t❡r❛t✐✈❡ ②✐❡❧❞s r❡✈❯♥③✐♣ ❛❜♦✈❡✱ ✇❤✐❝❤ ✐s ✈❡r② s✐♠✲ ♣❧❡✳ ■t❡r❛t✐♦♥ ❝❛♥ ❝♦♥str✉❝t ♠❛♥② r❡s✉❧ts ❛t ♦♥❝❡ ✐♥ ❞✐✛❡r❡♥t ❛r❣✉♠❡♥t ♣♦s✐✲ t✐♦♥s✳ ❇♦t❤ ♦✉t♣✉t ❧✐sts ❛r❡ ❜✉✐❧t ✐♥ r❡✈❡rs❡ ♦r❞❡r✱ ✇❤✐❝❤ ❝❛♥ ❜❡ ❝♦rr❡❝t❡❞ ❜② r❡✈❡rs✐♥❣ t❤❡ ✐♥♣✉t t♦ r❡✈❯♥③✐♣ ✳ ❚❤❡ t♦t❛❧ ❝♦sts ✇✐❧❧ ♣r♦❜❛❜❧② ❡①❝❡❡❞ t❤♦s❡ ♦❢ ✉♥③✐♣ ❞❡s♣✐t❡ t❤❡ ❛❞✈❛♥t❛❣❡s ♦❢ ✐t❡r❛t✐♦♥✳

  50. ❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✷ An Application: Making Change fun change (till, 0) = [] | change (c::till, amt) = if amt<c then change(till, amt) Slide 507 else c :: change(c::till, amt-c) > Warning: pattern matching is not exhaustive > val change = fn : int list * int -> int list • The recursion terminates when amt = 0. • Tries the largest coin first to use large coins. • The algorithm is greedy , and it CAN FAIL ! ❚❤❡ t✐❧❧ ❤❛s ✉♥❧✐♠✐t❡❞ s✉♣♣❧✐❡s ♦❢ ❝♦✐♥s✳ ❚❤❡ ❧❛r❣❡st ❝♦✐♥s s❤♦✉❧❞ ❜❡ tr✐❡❞ ✜rst✱ t♦ ❛✈♦✐❞ ❣✐✈✐♥❣ ❝❤❛♥❣❡ ❛❧❧ ✐♥ ♣❡♥♥✐❡s✳ ❚❤❡ ❧✐st ♦❢ ❧❡❣❛❧ ❝♦✐♥ ✈❛❧✉❡s✱ ❝❛❧❧❡❞ t✐❧❧ ✱ ✐s ❣✐✈❡♥ ✐♥ ❞❡s❝❡♥❞✐♥❣ ♦r❞❡r✱ s✉❝❤ ❛s ✺✵✱ ✷✵✱ ✶✵✱ ✺✱ ✷ ❛♥❞ ✶✳ ✭❘❡❝❛❧❧ t❤❛t t❤❡ ❤❡❛❞ ♦❢ ❛ ❧✐st ✐s t❤❡ ❡❧❡♠❡♥t ♠♦st ❡❛s✐❧② r❡❛❝❤❡❞✳✮ ❚❤❡ ❝♦❞❡ ❢♦r ❝❤❛♥❣❡ ✐s ❜❛s❡❞ ♦♥ s✐♠♣❧❡ ♦❜s❡r✈❛t✐♦♥s✳ • ❈❤❛♥❣❡ ❢♦r ③❡r♦ ❝♦♥s✐sts ♦❢ ♥♦ ❝♦✐♥s ❛t ❛❧❧✳ ✭◆♦t❡ t❤❡ ♣❛tt❡r♥ ♦❢ ✵ ✐♥ t❤❡ ✜rst ❝❧❛✉s❡✳✮ • ❋♦r ❛ ♥♦♥③❡r♦ ❛♠♦✉♥t✱ tr② t❤❡ ❧❛r❣❡st ❛✈❛✐❧❛❜❧❡ ❝♦✐♥✳ ■❢ ✐t ✐s s♠❛❧❧ ❡♥♦✉❣❤✱ ✉s❡ ✐t ❛♥❞ ❞❡❝r❡❛s❡ t❤❡ ❛♠♦✉♥t ❛❝❝♦r❞✐♥❣❧②✳ • ❊①❝❧✉❞❡ ❢r♦♠ ❝♦♥s✐❞❡r❛t✐♦♥ ❛♥② ❝♦✐♥s t❤❛t ❛r❡ t♦♦ ❧❛r❣❡✳ ❆❧t❤♦✉❣❤ ♥♦❜♦❞② ❝♦♥s✐❞❡rs ♠❛❦✐♥❣ ❝❤❛♥❣❡ ❢♦r ③❡r♦✱ t❤✐s ✐s t❤❡ s✐♠♣❧❡st ✇❛② t♦ ♠❛❦❡ t❤❡ ❛❧❣♦r✐t❤♠ t❡r♠✐♥❛t❡✳ ▼♦st ✐t❡r❛t✐✈❡ ♣r♦❝❡❞✉r❡s ❜❡❝♦♠❡ s✐♠♣❧❡st ✐❢✱ ✐♥ t❤❡✐r ❜❛s❡ ❝❛s❡✱ t❤❡② ❞♦ ♥♦t❤✐♥❣✳ ❆ ❜❛s❡ ❝❛s❡ ♦❢ ♦♥❡ ✐♥st❡❛❞ ♦❢ ③❡r♦ ✐s ♦❢t❡♥ ❛ s✐❣♥ ♦❢ ❛ ♥♦✈✐❝❡ ♣r♦❣r❛♠♠❡r✳ ❚❤❡ ❢✉♥❝t✐♦♥ ❝❛♥ t❡r♠✐♥❛t❡ ❡✐t❤❡r ✇✐t❤ s✉❝❝❡ss ♦r ❢❛✐❧✉r❡✳ ■t ❢❛✐❧s ❜② r❛✐s✐♥❣ ❡①❝❡♣t✐♦♥ ▼❛t❝❤ ✳ ❚❤❡ ❡①❝❡♣t✐♦♥ ♦❝❝✉rs ✐❢ ♥♦ ♣❛tt❡r♥ ♠❛t❝❤❡s✱ ♥❛♠❡❧② ✐❢ t✐❧❧ ❜❡❝♦♠❡s ❡♠♣t② ✇❤✐❧❡ ❛♠♦✉♥t ✐s st✐❧❧ ♥♦♥③❡r♦✳ ❯♥❢♦rt✉♥❛t❡❧②✱ ❢❛✐❧✉r❡ ❝❛♥ ♦❝❝✉r ❡✈❡♥ ✇❤❡♥ ❝❤❛♥❣❡ ❝❛♥ ❜❡ ♠❛❞❡✳ ❚❤❡ ❣r❡❡❞② ❵❧❛r❣❡st ❝♦✐♥ ✜rst✬ ❛♣♣r♦❛❝❤ ✐s t♦ ❜❧❛♠❡✳ ❙✉♣♣♦s❡ ✇❡ ❤❛✈❡ ❝♦✐♥s ♦❢ ✈❛❧✉❡s ✺ ❛♥❞ ✷✱ ❛♥❞ ♠✉st ♠❛❦❡ ❝❤❛♥❣❡ ❢♦r ✻❀ t❤❡ ♦♥❧② ✇❛② ✐s 6 = 2 + 2 + 2 ✱ ✐❣♥♦r✐♥❣ t❤❡ ✺✳ ●r❡❡❞② ❛❧❣♦r✐t❤♠s ❛r❡ ♦❢t❡♥ ❡✛❡❝t✐✈❡✱ ❜✉t ♥♦t ❤❡r❡✳

  51. ❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✸ A LL Ways of Making Change fun change (till, 0) = [[]] | change ([], amt) = [] | change (c::till, amt) = Slide 508 if amt<c then change(till, amt) else let fun allc [] = [] | allc(cs::css) = (c::cs)::allc css in allc (change(c::till, amt-c)) @ change(till, amt) end; ▲❡t ✉s ❣❡♥❡r❛❧✐③❡ t❤❡ ♣r♦❜❧❡♠ t♦ ✜♥❞ ❛❧❧ ♣♦ss✐❜❧❡ ✇❛②s ♦❢ ♠❛❦✐♥❣ ❝❤❛♥❣❡✱ r❡t✉r♥✐♥❣ t❤❡♠ ❛s ❛ ❧✐st ♦❢ s♦❧✉t✐♦♥s✳ ▲♦♦❦ ❛t t❤❡ t②♣❡✿ t❤❡ r❡s✉❧t ✐s ♥♦✇ ❛ ❧✐st ♦❢ ❧✐sts✳ ❃ ❝❤❛♥❣❡ ✿ ✐♥t ❧✐st ✯ ✐♥t ✲❃ ✐♥t ❧✐st ❧✐st ❚❤❡ ❝♦❞❡ ✇✐❧❧ ♥❡✈❡r r❛✐s❡ ❡①❝❡♣t✐♦♥s✳ ■t ❡①♣r❡ss❡s ❢❛✐❧✉r❡ ❜② r❡t✉r♥✐♥❣ ❛♥ ❡♠♣t② ❧✐st ♦❢ s♦❧✉t✐♦♥s✿ ✐t r❡t✉r♥s ❬❪ ✐❢ t❤❡ t✐❧❧ ✐s ❡♠♣t② ❛♥❞ t❤❡ ❛♠♦✉♥t ✐s ♥♦♥③❡r♦✳ ■❢ t❤❡ ❛♠♦✉♥t ✐s ③❡r♦✱ t❤❡♥ t❤❡r❡ ✐s ♦♥❧② ♦♥❡ ✇❛② ♦❢ ♠❛❦✐♥❣ ❝❤❛♥❣❡❀ t❤❡ r❡s✉❧t s❤♦✉❧❞ ❜❡ ❬❬❪❪ ✳ ❚❤✐s ✐s s✉❝❝❡ss ✐♥ t❤❡ ❜❛s❡ ❝❛s❡✳ ■♥ ♥♦♥tr✐✈✐❛❧ ❝❛s❡s✱ t❤❡r❡ ❛r❡ t✇♦ s♦✉r❝❡s ♦❢ s♦❧✉t✐♦♥s✿ t♦ ✉s❡ ❛ ❝♦✐♥ ✭✐❢ ♣♦ss✐❜❧❡✮ ❛♥❞ ❞❡❝r❡❛s❡ t❤❡ ❛♠♦✉♥t ❛❝❝♦r❞✐♥❣❧②✱ ♦r t♦ r❡♠♦✈❡ t❤❡ ❝✉rr❡♥t ❝♦✐♥ ✈❛❧✉❡ ❢r♦♠ ❝♦♥s✐❞❡r❛t✐♦♥✳ ❚❤❡ ❢✉♥❝t✐♦♥ ❛❧❧❝ ✐s ❞❡❝❧❛r❡❞ ❧♦❝❛❧❧② ✐♥ ♦r❞❡r t♦ ♠❛❦❡ ✉s❡ ♦❢ ❝ ✱ t❤❡ ❝✉rr❡♥t ❝♦✐♥✳ ■t ❛❞❞s ❛♥ ❡①tr❛ ❝ t♦ ❛❧❧ t❤❡ s♦❧✉t✐♦♥s r❡t✉r♥❡❞ ❜② t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧ t♦ ♠❛❦❡ ❝❤❛♥❣❡ ❢♦r ❛♠t✲❝ ✳ ❖❜s❡r✈❡ t❤❡ ♥❛♠✐♥❣ ❝♦♥✈❡♥t✐♦♥ ✿ ❝s ✐s ❛ ❧✐st ♦❢ ❝♦✐♥s✱ ✇❤✐❧❡ ❝ss ✐s ❛ ❧✐st ♦❢ s✉❝❤ ❧✐sts✳ ❚❤❡ tr❛✐❧✐♥❣ ❵s✬ ✐s s✉❣❣❡st✐✈❡ ♦❢ ❛ ♣❧✉r❛❧✳

  52. ❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✹ A LL Ways of Making Change — Faster! fun change(till, 0, chg, chgs) = chg::chgs | change([], amt, chg, chgs) = chgs | change(c::till, amt, chg, chgs) = Slide 509 if amt<0 then chgs else change(c::till, amt-c, c::chg, change(till, amt, chg, chgs)) We’ve added another accumulating parameter! Repeatedly improving simple code is called stepwise refinement . ❚✇♦ ❡①tr❛ ❛r❣✉♠❡♥ts ❡❧✐♠✐♥❛t❡ ♠❛♥② ✿✿ ❛♥❞ ❛♣♣❡♥❞ ♦♣❡r❛t✐♦♥s ❢r♦♠ t❤❡ ♣r❡✈✐♦✉s s❧✐❞❡✬s ❝❤❛♥❣❡ ❢✉♥❝t✐♦♥✳ ❚❤❡ ✜rst✱ ❝❤❣ ✱ ❛❝❝✉♠✉❧❛t❡s t❤❡ ❝♦✐♥s ❝❤♦s❡♥ s♦ ❢❛r❀ ♦♥❡ ❡✈❛❧✉❛t✐♦♥ ♦❢ ❝✿✿❝❤❣ r❡♣❧❛❝❡s ♠❛♥② ❡✈❛❧✉❛t✐♦♥s ♦❢ ❛❧❧❝ ✳ ❚❤❡ s❡❝♦♥❞✱ ❝❤❣s ✱ ❛❝❝✉♠✉❧❛t❡s t❤❡ ❧✐st ♦❢ s♦❧✉t✐♦♥s s♦ ❢❛r❀ ✐t ❛✈♦✐❞s t❤❡ ♥❡❡❞ ❢♦r ❛♣♣❡♥❞✳ ❚❤✐s ✈❡rs✐♦♥ r✉♥s s❡✈❡r❛❧ t✐♠❡s ❢❛st❡r t❤❛♥ t❤❡ ♣r❡✈✐♦✉s ♦♥❡✳ ▼❛❦✐♥❣ ❝❤❛♥❣❡ ✐s st✐❧❧ ❡①tr❡♠❡❧② s❧♦✇ ❢♦r ❛♥ ♦❜✈✐♦✉s r❡❛s♦♥✿ t❤❡ ♥✉♠❜❡r ♦❢ s♦❧✉t✐♦♥s ❣r♦✇s r❛♣✐❞❧② ✐♥ t❤❡ ❛♠♦✉♥t ❜❡✐♥❣ ❝❤❛♥❣❡❞✳ ❯s✐♥❣ ✺✵✱ ✷✵✱ ✶✵✱ ✺✱ ✷ ❛♥❞ ✶✱ t❤❡r❡ ❛r❡ ✹✸✻✻ ✇❛②s ♦❢ ❡①♣r❡ss✐♥❣ ✾✾✳ ❲❡ s❤❛❧❧ r❡✈✐s✐t t❤❡ ❵♠❛❦✐♥❣ ❝❤❛♥❣❡✬ t❛s❦ ❧❛t❡r t♦ ✐❧❧✉str❛t❡ ❡①❝❡♣t✐♦♥✲ ❤❛♥❞❧✐♥❣✳ ❖✉r t❤r❡❡ ❝❤❛♥❣❡ ❢✉♥❝t✐♦♥s ✐❧❧✉str❛t❡ ❛ ❜❛s✐❝ t❡❝❤♥✐q✉❡✿ ♣r♦❣r❛♠ ❞❡✈❡❧✲ ♦♣♠❡♥t ❜② st❡♣✇✐s❡ r❡✜♥❡♠❡♥t ✳ ❇❡❣✐♥ ❜② ✇r✐t✐♥❣ ❛ ✈❡r② s✐♠♣❧❡ ♣r♦❣r❛♠ ❛♥❞ ❛❞❞ r❡q✉✐r❡♠❡♥ts ✐♥❞✐✈✐❞✉❛❧❧②✳ ❆❞❞ ❡✣❝✐❡♥❝② r❡✜♥❡♠❡♥ts ❧❛st ♦❢ ❛❧❧✳ ❊✈❡♥ ✐❢ t❤❡ s✐♠♣❧❡r ♣r♦❣r❛♠ ❝❛♥♥♦t ❜❡ ✐♥❝❧✉❞❡❞ ✐♥ t❤❡ ♥❡①t ✈❡rs✐♦♥ ❛♥❞ ❤❛s t♦ ❜❡ ❞✐s❝❛r❞❡❞✱ ♦♥❡ ❤❛s ❧❡❛r♥❡❞ ❛❜♦✉t t❤❡ t❛s❦ ❜② ✇r✐t✐♥❣ ✐t✳

  53. ❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✺ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✽✷✲✶✵✼✱ t❤♦✉❣❤ ②♦✉ ♠❛② ✇❛♥t t♦ s❦✐♣ s♦♠❡ ♦❢ t❤❡ ❤❛r❞❡r ❡①❛♠♣❧❡s✳ ❍♦✇ ❞♦❡s t❤✐s ✈❡rs✐♦♥ ♦❢ ③✐♣ ❞✐✛❡r ❢r♦♠ t❤❡ ♦♥❡ ❛❜♦✈❡❄ ❊①❡r❝✐s❡ ✺✳✶ ❢✉♥ ③✐♣ ✭①✿✿①s✱②✿✿②s✮ ❂ ✭①✱②✮ ✿✿ ③✐♣✭①s✱②s✮ ⑤ ③✐♣ ✭❬❪✱ ❬❪✮ ❂ ❬❪❀ ❲❤❛t ❛ss✉♠♣t✐♦♥s ❞♦ t❤❡ ❵♠❛❦✐♥❣ ❝❤❛♥❣❡✬ ❢✉♥❝t✐♦♥s ♠❛❦❡ ❊①❡r❝✐s❡ ✺✳✷ ❛❜♦✉t t❤❡ ✈❛r✐❛❜❧❡s t✐❧❧ ✱ ❝ ❛♥❞ ❛♠t ❄ ■❧❧✉str❛t❡ ✇❤❛t ❝♦✉❧❞ ❤❛♣♣❡♥ ✐❢ s♦♠❡ ♦❢ t❤❡s❡ ❛ss✉♠♣t✐♦♥s ✇❡r❡ ✈✐♦❧❛t❡❞✳ ❙❤♦✇ t❤❛t t❤❡ ♥✉♠❜❡r ♦❢ ✇❛②s ♦❢ ♠❛❦✐♥❣ ❝❤❛♥❣❡ ❢♦r n ✭✐❣✲ ❊①❡r❝✐s❡ ✺✳✸ ♥♦r✐♥❣ ♦r❞❡r✮ ✐s O ( n ) ✐❢ t❤❡r❡ ❛r❡ t✇♦ ❧❡❣❛❧ ❝♦✐♥ ✈❛❧✉❡s✳ ❲❤❛t ✐❢ t❤❡r❡ ❛r❡ t❤r❡❡✱ ❢♦✉r✱ ✳ ✳ ✳ ❝♦✐♥ ✈❛❧✉❡s❄

  54. ❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✻ Sorting: Arranging Items into Order a few applications: Slide 601 • fast search • fast merging • finding duplicates • inverting tables • graphics algorithms ❙♦rt✐♥❣ ✐s ♣❡r❤❛♣s t❤❡ ♠♦st ❞❡❡♣❧② st✉❞✐❡❞ ❛s♣❡❝t ♦❢ ❛❧❣♦r✐t❤♠ ❞❡s✐❣♥✳ ❑♥✉t❤✬s s❡r✐❡s ❚❤❡ ❆rt ♦❢ ❈♦♠♣✉t❡r Pr♦❣r❛♠♠✐♥❣ ❞❡✈♦t❡s ❛♥ ❡♥t✐r❡ ✈♦❧✉♠❡ t♦ s♦rt✐♥❣ ❛♥❞ s❡❛r❝❤✐♥❣ ❬✾❪✦ ❙❡❞❣❡✇✐❝❦ ❬✶✹❪ ❛❧s♦ ❝♦✈❡rs s♦rt✐♥❣✳ ❙♦rt✐♥❣ ❤❛s ❝♦✉♥t❧❡ss ❛♣♣❧✐❝❛t✐♦♥s✳ ❙♦rt✐♥❣ ❛ ❝♦❧❧❡❝t✐♦♥ ❛❧❧♦✇s ✐t❡♠s t♦ ❜❡ ❢♦✉♥❞ q✉✐❝❦❧②✳ ❘❡❝❛❧❧ t❤❛t ❧✐♥❡❛r s❡❛r❝❤ r❡q✉✐r❡s O ( n ) st❡♣s t♦ s❡❛r❝❤ ❛♠♦♥❣ n ✐t❡♠s✳ ❆ s♦rt❡❞ ❝♦❧❧❡❝t✐♦♥ ❛❞♠✐ts ❜✐♥❛r② s❡❛r❝❤ ✱ ✇❤✐❝❤ r❡q✉✐r❡s ♦♥❧② O (log n ) t✐♠❡✳ ❚❤❡ ✐❞❡❛ ♦❢ ❜✐♥❛r② s❡❛r❝❤ ✐s t♦ ❝♦♠♣❛r❡ t❤❡ ✐t❡♠ ❜❡✐♥❣ s♦✉❣❤t ✇✐t❤ t❤❡ ♠✐❞❞❧❡ ✐t❡♠ ✭✐♥ ♣♦s✐t✐♦♥ n/ 2 ✮ ❛♥❞ t❤❡♥ t♦ ❞✐s❝❛r❞ ❡✐t❤❡r t❤❡ ❧❡❢t ❤❛❧❢ ♦r t❤❡ r✐❣❤t✱ ❞❡♣❡♥❞✐♥❣ ♦♥ t❤❡ r❡s✉❧t ♦❢ t❤❡ ❝♦♠♣❛r✐s♦♥✳ ❇✐♥❛r② s❡❛r❝❤ ♥❡❡❞s ❛rr❛②s ♦r tr❡❡s✱ ♥♦t ❧✐sts❀ ✇❡ s❤❛❧❧ ❝♦♠❡ t♦ ❜✐♥❛r② s❡❛r❝❤ tr❡❡s ❧❛t❡r✳ ❚✇♦ s♦rt❡❞ ✜❧❡s ❝❛♥ q✉✐❝❦❧② ❜❡ ♠❡r❣❡❞ t♦ ❢♦r♠ ❛ ❧❛r❣❡r s♦rt❡❞ ✜❧❡✳ ❖t❤❡r ❛♣♣❧✐❝❛t✐♦♥s ✐♥❝❧✉❞❡ ✜♥❞✐♥❣ ❞✉♣❧✐❝❛t❡s ✿ ❛❢t❡r s♦rt✐♥❣✱ t❤❡② ❛r❡ ❛❞❥❛❝❡♥t✳ ❆ t❡❧❡♣❤♦♥❡ ❞✐r❡❝t♦r② ✐s s♦rt❡❞ ❛❧♣❤❛❜❡t✐❝❛❧❧② ❜② ♥❛♠❡✳ ❚❤❡ s❛♠❡ ✐♥❢♦r✲ ♠❛t✐♦♥ ❝❛♥ ✐♥st❡❛❞ ❜❡ s♦rt❡❞ ❜② t❡❧❡♣❤♦♥❡ ♥✉♠❜❡r ✭✉s❡❢✉❧ t♦ t❤❡ ♣♦❧✐❝❡✮ ♦r ❜② str❡❡t ❛❞❞r❡ss ✭✉s❡❢✉❧ t♦ ❥✉♥❦✲♠❛✐❧ ✜r♠s✮✳ ❙♦rt✐♥❣ ✐♥❢♦r♠❛t✐♦♥ ✐♥ ❞✐✛❡r❡♥t ✇❛②s ❣✐✈❡s ✐t ❞✐✛❡r❡♥t ❛♣♣❧✐❝❛t✐♦♥s✳ ❈♦♠♠♦♥ s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s ✐♥❝❧✉❞❡ ✐♥s❡rt✐♦♥ s♦rt ✱ q✉✐❝❦s♦rt ✱ ♠❡r❣❡s♦rt ❛♥❞ ❤❡❛♣s♦rt ✳ ❲❡ s❤❛❧❧ ❝♦♥s✐❞❡r t❤❡ ✜rst t❤r❡❡ ♦❢ t❤❡s❡✳ ❊❛❝❤ ❛❧❣♦r✐t❤♠ ❤❛s ✐ts ❛❞✈❛♥t❛❣❡s✳ ❆s ❛ ❝♦♥❝r❡t❡ ❜❛s✐s ❢♦r ❝♦♠♣❛r✐s♦♥✱ r✉♥t✐♠❡s ❛r❡ q✉♦t❡❞ ❢♦r ❉❊❈st❛t✐♦♥ ❝♦♠♣✉t❡rs✳ ✭❚❤❡s❡ ✇❡r❡ ❜❛s❡❞ ♦♥ t❤❡ ▼■P❙ ❝❤✐♣✱ ❛♥ ❡❛r❧② ❘■❙❈ ❞❡s✐❣♥✳✮

  55. ❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✼ How Fast Can We Sort? typically count comparisons C ( n ) Slide 602 there are n ! permutations of n elements each comparison distinguishes two permutations 2 C ( n ) ≥ n ! , therefore C ( n ) ≥ log( n !) ≈ n log n − 1 . 44 n ❚❤❡ ✉s✉❛❧ ♠❡❛s✉r❡ ♦❢ ❡✣❝✐❡♥❝② ❢♦r s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s ✐s t❤❡ ♥✉♠❜❡r ♦❢ ❝♦♠♣❛r✐s♦♥ ♦♣❡r❛t✐♦♥s r❡q✉✐r❡❞✳ ▼❡r❣❡s♦rt r❡q✉✐r❡s ♦♥❧② O ( n log n ) ❝♦♠♣❛r✲ ✐s♦♥s t♦ s♦rt ❛♥ ✐♥♣✉t ♦❢ n ✐t❡♠s✳ ■t ✐s str❛✐❣❤t❢♦r✇❛r❞ t♦ ♣r♦✈❡ t❤❛t ❛t t❤✐s ❝♦♠♣❧❡①✐t② ✐s t❤❡ ❜❡st ♣♦ss✐❜❧❡ ❬✷✱ ♣❛❣❡s ✽✻✕✼❪✳ ❚❤❡r❡ ❛r❡ n ! ♣❡r♠✉t❛t✐♦♥s ♦❢ n ❡❧❡♠❡♥ts ❛♥❞ ❡❛❝❤ ❝♦♠♣❛r✐s♦♥ ❞✐st✐♥❣✉✐s❤❡s t✇♦ ♣❡r♠✉t❛t✐♦♥s✳ ❚❤❡ ❧♦✇❡r ❜♦✉♥❞ ♦♥ t❤❡ ♥✉♠❜❡r ♦❢ ❝♦♠♣❛r✐s♦♥s✱ C ( n ) ✱ ✐s ♦❜t❛✐♥❡❞ ❜② s♦❧✈✐♥❣ 2 C ( n ) ≥ n ! ❀ t❤❡r❡❢♦r❡ C ( n ) ≥ log( n !) ≈ n log n − 1 . 44 n ✳ ■♥ ♦r❞❡r t♦ ❝♦♠♣❛r❡ t❤❡ s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s✱ ✇❡ ✉s❡ t❤❡ ❢♦❧❧♦✇✐♥❣ s♦✉r❝❡ ♦❢ ♣s❡✉❞♦✲r❛♥❞♦♠ ♥✉♠❜❡rs ❬✶✷❪✿ ❧♦❝❛❧ ✈❛❧ ❛ ❂ ✶✻✽✵✼✳✵ ❛♥❞ ♠ ❂ ✷✶✹✼✹✽✸✻✹✼✳✵ ✐♥ ❢✉♥ ♥❡①tr❛♥❞♦♠ s❡❡❞ ❂ ❧❡t ✈❛❧ t ❂ ❛✯s❡❡❞ ✐♥ t ✲ ♠ ✯ r❡❛❧✭❢❧♦♦r✭t✴♠✮✮ ❡♥❞ ❛♥❞ tr✉♥❝t♦ ❦ r ❂ ✶ ✰ ❢❧♦♦r✭✭r ✴ ♠✮ ✯ ✭r❡❛❧ ❦✮✮ ❡♥❞❀ ❲❡ ❜✐♥❞ t❤❡ ✐❞❡♥t✐✜❡r rs t♦ ❛ ❧✐st ♦❢ ✶✵✱✵✵✵ r❛♥❞♦♠ ♥✉♠❜❡rs✳ ❢✉♥ r❛♥❞❧✐st ✭♥✱s❡❡❞✱s❡❡❞s✮ ❂ ✐❢ ♥❂✵ t❤❡♥ ✭s❡❡❞✱s❡❡❞s✮ ❡❧s❡ r❛♥❞❧✐st✭♥✲✶✱ ♥❡①tr❛♥❞♦♠ s❡❡❞✱ s❡❡❞✿✿s❡❡❞s✮❀ ✈❛❧ ✭s❡❡❞✱rs✮ ❂ r❛♥❞❧✐st✭✶✵✵✵✵✱ ✶✳✵✱ ❬❪✮❀ ◆❡✈❡r ♠✐♥❞ ❤♦✇ t❤✐s ✇♦r❦s✱ ❜✉t ♥♦t❡ t❤❛t ❣❡♥❡r❛t✐♥❣ st❛t✐st✐❝❛❧❧② ❣♦♦❞ r❛♥✲ ❞♦♠ ♥✉♠❜❡rs ✐s ❤❛r❞✳ ▼✉❝❤ ❡✛♦rt ❤❛s ❣♦♥❡ ✐♥t♦ t❤♦s❡ ❢❡✇ ❧✐♥❡s ♦❢ ❝♦❞❡✳

  56. ❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✽ Insertion Sort Insert does n/ 2 comparisons on average fun ins (x:real, []) = [x] | ins (x:real, y::ys) = Slide 603 if x<=y then x::y::ys else y::ins(x,ys); Insertion sort takes O ( n 2 ) comparisons on average fun insort [] = [] | insort (x::xs) = ins(x, insort xs); 174 seconds to sort 10,000 random numbers ■t❡♠s ❢r♦♠ t❤❡ ✐♥♣✉t ❛r❡ ❝♦♣✐❡❞ ♦♥❡ ❛t ❛ t✐♠❡ t♦ t❤❡ ♦✉t♣✉t✳ ❊❛❝❤ ♥❡✇ ✐t❡♠ ✐s ✐♥s❡rt❡❞ ✐♥t♦ t❤❡ r✐❣❤t ♣❧❛❝❡ s♦ t❤❛t t❤❡ ♦✉t♣✉t ✐s ❛❧✇❛②s ✐♥ ♦r❞❡r✳ ❲❡ ❝♦✉❧❞ ❡❛s✐❧② ✇r✐t❡ ✐t❡r❛t✐✈❡ ✈❡rs✐♦♥s ♦❢ t❤❡s❡ ❢✉♥❝t✐♦♥s✱ ❜✉t t♦ ♥♦ ♣✉r♣♦s❡✳ ■♥s❡rt✐♦♥ s♦rt ✐s s❧♦✇ ❜❡❝❛✉s❡ ✐t ❞♦❡s O ( n 2 ) ❝♦♠♣❛r✐s♦♥s ✭❛♥❞ ❛ ❧♦t ♦❢ ❧✐st ❝♦♣②✐♥❣✮✱ ♥♦t ❜❡❝❛✉s❡ ✐t ✐s r❡❝✉rs✐✈❡✳ ■ts q✉❛❞r❛t✐❝ r✉♥t✐♠❡ ♠❛❦❡s ✐t ♥❡❛r❧② ✉s❡❧❡ss✿ ✐t t❛❦❡s ✶✼✹ s❡❝♦♥❞s ❢♦r ♦✉r ❡①❛♠♣❧❡ ✇❤✐❧❡ t❤❡ ♥❡①t✲✇♦rst ✜❣✉r❡ ✐s ✶✳✹ s❡❝♦♥❞s✳ ■♥s❡rt✐♦♥ s♦rt ✐s ✇♦rt❤ ❝♦♥s✐❞❡r✐♥❣ ❜❡❝❛✉s❡ ✐t ✐s ❡❛s② t♦ ❝♦❞❡ ❛♥❞ ✐❧❧✉s✲ tr❛t❡s t❤❡ ❝♦♥❝❡♣ts✳ ❚✇♦ ❡✣❝✐❡♥t s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s✱ ♠❡r❣❡s♦rt ❛♥❞ ❤❡❛♣s♦rt✱ ❝❛♥ ❜❡ r❡❣❛r❞❡❞ ❛s r❡✜♥❡♠❡♥ts ♦❢ ✐♥s❡rt✐♦♥ s♦rt✳ ❚❤❡ t②♣❡ ❝♦♥str❛✐♥t ✿r❡❛❧ r❡s♦❧✈❡s t❤❡ ♦✈❡r❧♦❛❞✐♥❣ ♦❢ t❤❡ ❁❂ ♦♣❡r❛t♦r❀ r❡❝❛❧❧ ▲❡❝t✳ ✷✳ ❆❧❧ ♦✉r s♦rt✐♥❣ ❢✉♥❝t✐♦♥s ✇✐❧❧ ♥❡❡❞ ❛ t②♣❡ ❝♦♥str❛✐♥t s♦♠❡✲ ✇❤❡r❡✳ ❚❤❡ ♥♦t✐♦♥ ♦❢ s♦rt✐♥❣ ❞❡♣❡♥❞s ✉♣♦♥ t❤❡ ❢♦r♠ ♦❢ ❝♦♠♣❛r✐s♦♥ ❜❡✐♥❣ ❞♦♥❡✱ ✇❤✐❝❤ ✐♥ t✉r♥ ❞❡t❡r♠✐♥❡s t❤❡ t②♣❡ ♦❢ t❤❡ s♦rt✐♥❣ ❢✉♥❝t✐♦♥✳

  57. ❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✾ Quicksort: The Idea • choose a pivot element, a • Divide : partition the input into two sublists: Slide 604 – those at most a in value – those exceeding a • Conquer using recursive calls to sort the sublists • Combine the sorted lists by appending one to the other ◗✉✐❝❦s♦rt ✇❛s ✐♥✈❡♥t❡❞ ❜② ❈✳ ❆✳ ❘✳ ❍♦❛r❡✱ ✇❤♦ ❤❛s ❥✉st ♠♦✈❡❞ ❢r♦♠ ❖①❢♦r❞ t♦ ▼✐❝r♦s♦❢t ❘❡s❡❛r❝❤✱ ❈❛♠❜r✐❞❣❡✳ ◗✉✐❝❦s♦rt ✇♦r❦s ❜② ❞✐✈✐❞❡ ❛♥❞ ❝♦♥q✉❡r ✱ ❛ ❜❛s✐❝ ❛❧❣♦r✐t❤♠ ❞❡s✐❣♥ ♣r✐♥❝✐♣❧❡✳ ◗✉✐❝❦s♦rt ❝❤♦♦s❡s ❢r♦♠ t❤❡ ✐♥♣✉t s♦♠❡ ✈❛❧✉❡ a ✱ ❝❛❧❧❡❞ t❤❡ ♣✐✈♦t ✳ ■t ♣❛rt✐t✐♦♥s t❤❡ r❡♠❛✐♥✐♥❣ ✐t❡♠s ✐♥t♦ t✇♦ ♣❛rts✿ t❤♦s❡ ≤ a ✱ ❛♥❞ t❤♦s❡ > a ✳ ■t s♦rts ❡❛❝❤ ♣❛rt r❡❝✉rs✐✈❡❧②✱ t❤❡♥ ♣✉ts t❤❡ s♠❛❧❧❡r ♣❛rt ❜❡❢♦r❡ t❤❡ ❣r❡❛t❡r✳ ❚❤❡ ❝❧❡✈❡r❡st ❢❡❛t✉r❡ ♦❢ ❍♦❛r❡✬s ❛❧❣♦r✐t❤♠ ✇❛s t❤❛t t❤❡ ♣❛rt✐t✐♦♥ ❝♦✉❧❞ ❜❡ ❞♦♥❡ ✐♥ ♣❧❛❝❡ ❜② ❡①❝❤❛♥❣✐♥❣ ❛rr❛② ❡❧❡♠❡♥ts✳ ◗✉✐❝❦s♦rt ✇❛s ✐♥✈❡♥t❡❞ ❜❡❢♦r❡ r❡❝✉rs✐♦♥ ✇❛s ✇❡❧❧ ❦♥♦✇♥✱ ❛♥❞ ♣❡♦♣❧❡ ❢♦✉♥❞ ✐t ❡①tr❡♠❡❧② ❤❛r❞ t♦ ✉♥❞❡rst❛♥❞✳ ❆s ✉s✉❛❧✱ ✇❡ s❤❛❧❧ ❝♦♥s✐❞❡r ❛ ❧✐st ✈❡rs✐♦♥ ❜❛s❡❞ ♦♥ ❢✉♥❝t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣✳

  58. ❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✵ Quicksort: The Code fun quick [] = [] | quick [x] = [x] | quick (a::bs) = let fun part (l,r,[]) : real list = Slide 605 (quick l) @ (a :: quick r) | part (l, r, x::xs) = if x<=a then part(x::l, r, xs) else part(l, x::r, xs) in part([],[],bs) end; 0.74 seconds to sort 10,000 random numbers ❖✉r ▼▲ q✉✐❝❦s♦rt ❝♦♣✐❡s t❤❡ ✐t❡♠s✳ ■t ✐s st✐❧❧ ♣r❡tt② ❢❛st✱ ❛♥❞ ✐t ✐s ♠✉❝❤ ❡❛s✐❡r t♦ ✉♥❞❡rst❛♥❞✳ ■t t❛❦❡s r♦✉❣❤❧② ✵✳✼✹ s❡❝♦♥❞s t♦ s♦rt rs ✱ ♦✉r ❧✐st ♦❢ r❛♥❞♦♠ ♥✉♠❜❡rs✳ ❚❤❡ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ ❝♦♥s✐sts ♦❢ t❤r❡❡ ❝❧❛✉s❡s✳ ❚❤❡ ✜rst ❤❛♥❞❧❡s t❤❡ ❡♠♣t② ❧✐st❀ t❤❡ s❡❝♦♥❞ ❤❛♥❞❧❡s s✐♥❣❧❡t♦♥ ❧✐sts ✭t❤♦s❡ ♦❢ t❤❡ ❢♦r♠ ❬①❪ ✮❀ t❤❡ t❤✐r❞ ❤❛♥❞❧❡s ❧✐sts ♦❢ t✇♦ ♦r ♠♦r❡ ❡❧❡♠❡♥ts✳ ❖❢t❡♥✱ ❧✐sts ♦❢ ❧❡♥❣t❤ ✉♣ t♦ ✜✈❡ ♦r s♦ ❛r❡ tr❡❛t❡❞ ❛s s♣❡❝✐❛❧ ❝❛s❡s t♦ ❜♦♦st s♣❡❡❞✳ ❚❤❡ ❧♦❝❛❧❧② ❞❡❝❧❛r❡❞ ❢✉♥❝t✐♦♥ ♣❛rt ♣❛rt✐t✐♦♥s t❤❡ ✐♥♣✉t ✉s✐♥❣ ❛ ❛s t❤❡ ♣✐✈♦t✳ ❚❤❡ ❛r❣✉♠❡♥ts ❧ ❛♥❞ r ❛❝❝✉♠✉❧❛t❡ ✐t❡♠s ❢♦r t❤❡ ❧❡❢t ✭ ≤ a ✮ ❛♥❞ r✐❣❤t ✭ > a ✮ ♣❛rts ♦❢ t❤❡ ✐♥♣✉t✱ r❡s♣❡❝t✐✈❡❧②✳ ■t ✐s ♥♦t ❤❛r❞ t♦ ♣r♦✈❡ t❤❛t q✉✐❝❦s♦rt ❞♦❡s n log n ❝♦♠♣❛r✐s♦♥s✱ ✐♥ t❤❡ ❛✈❡r❛❣❡ ❝❛s❡ ❬✷✱ ♣❛❣❡ ✾✹❪✳ ❲✐t❤ r❛♥❞♦♠ ❞❛t❛✱ t❤❡ ♣✐✈♦t ✉s✉❛❧❧② ❤❛s ❛♥ ❛✈❡r❛❣❡ ✈❛❧✉❡ t❤❛t ❞✐✈✐❞❡s t❤❡ ✐♥♣✉t ✐♥ t✇♦ ❛♣♣r♦①✐♠❛t❡❧② ❡q✉❛❧ ♣❛rts✳ ❲❡ ❤❛✈❡ t❤❡ r❡❝✉rr❡♥❝❡ T (1) = 1 ❛♥❞ T ( n ) = 2 T ( n/ 2) + n ✱ ✇❤✐❝❤ ✐s O ( n log n ) ✳ ■♥ ♦✉r ❡①❛♠♣❧❡✱ ✐t ✐s ❛❜♦✉t ✷✸✺ t✐♠❡s ❢❛st❡r t❤❛♥ ✐♥s❡rt✐♦♥ s♦rt✳ ■♥ t❤❡ ✇♦rst ❝❛s❡✱ q✉✐❝❦s♦rt✬s r✉♥♥✐♥❣ t✐♠❡ ✐s q✉❛❞r❛t✐❝✦ ❆♥ ❡①❛♠♣❧❡ ✐s ✇❤❡♥ ✐ts ✐♥♣✉t ✐s ❛❧♠♦st s♦rt❡❞ ♦r r❡✈❡rs❡ s♦rt❡❞✳ ◆❡❛r❧② ❛❧❧ ♦❢ t❤❡ ✐t❡♠s ❡♥❞ ✉♣ ✐♥ ♦♥❡ ♣❛rt✐t✐♦♥❀ ✇♦r❦ ✐s ♥♦t ❞✐✈✐❞❡❞ ❡✈❡♥❧②✳ ❲❡ ❤❛✈❡ t❤❡ r❡❝✉rr❡♥❝❡ T (1) = 1 ❛♥❞ T ( n + 1) = T ( n ) + n ✱ ✇❤✐❝❤ ✐s O ( n 2 ) ✳ ❘❛♥❞♦♠✐③✐♥❣ t❤❡ ✐♥♣✉t ♠❛❦❡s t❤❡ ✇♦rst ❝❛s❡ ❤✐❣❤❧② ✉♥❧✐❦❡❧②✳

  59. ❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✶ Append-Free Quicksort fun quik([], sorted) = sorted | quik([x], sorted) = x::sorted | quik(a::bs, sorted) = Slide 606 let fun part (l, r, []) : real list = quik(l, a :: quik(r,sorted)) | part (l, r, x::xs) = if x<=a then part(x::l, r, xs) else part(l, x::r, xs) in part([],[],bs) end; 0.53 seconds to sort 10,000 random numbers ❚❤❡ ❧✐st s♦rt❡❞ ❛❝❝✉♠✉❧❛t❡s t❤❡ r❡s✉❧t ✐♥ t❤❡ ❝♦♠❜✐♥❡ st❛❣❡ ♦❢ t❤❡ q✉✐❝❦✲ s♦rt ❛❧❣♦r✐t❤♠✳ ❲❡ ❤❛✈❡ ❛❣❛✐♥ ✉s❡❞ t❤❡ st❛♥❞❛r❞ t❡❝❤♥✐q✉❡ ❢♦r ❡❧✐♠✐♥❛t✐♥❣ ❛♣♣❡♥❞✳ ❈❛❧❧✐♥❣ q✉✐❦✭①s✱s♦rt❡❞✮ r❡✈❡rs❡s t❤❡ ❡❧❡♠❡♥ts ♦❢ ①s ❛♥❞ ♣r❡♣❡♥❞s t❤❡♠ t♦ t❤❡ ❧✐st s♦rt❡❞ ✳ ▲♦♦❦✐♥❣ ❝❧♦s❡❧② ❛t ♣❛rt ✱ ♦❜s❡r✈❡ t❤❛t q✉✐❦✭r✱s♦rt❡❞✮ ✐s ♣❡r❢♦r♠❡❞ ✜rst✳ ❚❤❡♥ ❛ ✐s ❝♦♥s❡❞ t♦ t❤✐s s♦rt❡❞ ❧✐st✳ ❋✐♥❛❧❧②✱ q✉✐❦ ✐s ❝❛❧❧❡❞ ❛❣❛✐♥ t♦ s♦rt t❤❡ ❡❧❡♠❡♥ts ♦❢ ❧ ✳ ❚❤❡ s♣❡❡❞✉♣ ✐s s✐❣♥✐✜❝❛♥t✳ ❆♥ ✐♠♣❡r❛t✐✈❡ q✉✐❝❦s♦rt ❝♦❞❡❞ ✐♥ P❛s❝❛❧ ✭t❛❦❡♥ ❢r♦♠ ❙❡❞❣❡✇✐❝❦ ❬✶✹❪✮ ✐s ❥✉st s❧✐❣❤t❧② ❢❛st❡r t❤❛♥ ❢✉♥❝t✐♦♥ q✉✐❦ ✳ ❚❤❡ ♥❡❛r✲❛❣r❡❡♠❡♥t ✐s s✉r♣r✐s✐♥❣ ❜❡❝❛✉s❡ t❤❡ ❝♦♠♣✉t❛t✐♦♥❛❧ ♦✈❡r❤❡❛❞s ♦❢ ❧✐sts ❡①✲ ❝❡❡❞ t❤♦s❡ ♦❢ ❛rr❛②s✳ ■♥ r❡❛❧✐st✐❝ ❛♣♣❧✐❝❛t✐♦♥s✱ ❝♦♠♣❛r✐s♦♥s ❛r❡ t❤❡ ❞♦♠✐♥❛♥t ❝♦st ❛♥❞ t❤❡ ♦✈❡r❤❡❛❞s ♠❛tt❡r ❡✈❡♥ ❧❡ss✳

  60. ❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✷ Merging Two Lists Merge joins two sorted lists fun merge([],ys) = ys : real list Slide 607 | merge(xs,[]) = xs | merge(x::xs, y::ys) = if x<=y then x::merge(xs, y::ys) else y::merge(x::xs, ys); Generalises Insert to two lists Does at most m + n − 1 comparisons ▼❡r❣✐♥❣ ♠❡❛♥s ❝♦♠❜✐♥✐♥❣ t✇♦ s♦rt❡❞ ❧✐sts t♦ ❢♦r♠ ❛ ❧❛r❣❡r s♦rt❡❞ ❧✐st✳ ■t ❞♦❡s ❛t ♠♦st m + n ❝♦♠♣❛r✐s♦♥s✱ ✇❤❡r❡ m ❛♥❞ n ❛r❡ t❤❡ ❧❡♥❣t❤s ♦❢ t❤❡ ✐♥♣✉t ❧✐sts✳ ■❢ m ❛♥❞ n ❛r❡ r♦✉❣❤❧② ❡q✉❛❧ t❤❡♥ ✇❡ ❤❛✈❡ ❛ ❢❛st ✇❛② ♦❢ ❝♦♥str✉❝t✐♥❣ s♦rt❡❞ ❧✐sts❀ ✐❢ n = 1 t❤❡♥ ♠❡r❣✐♥❣ ❞❡❣❡♥❡r❛t❡s t♦ ✐♥s❡rt✐♦♥✱ ❞♦✐♥❣ ♠✉❝❤ ✇♦r❦ ❢♦r ❧✐tt❧❡ ❣❛✐♥✳ ▼❡r❣✐♥❣ ✐s t❤❡ ❜❛s✐s ♦❢ s❡✈❡r❛❧ s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s❀ ✇❡ ❧♦♦❦ ❛t ❛ ❞✐✈✐❞❡✲ ❛♥❞✲❝♦♥q✉❡r ♦♥❡✳ ▼❡r❣❡s♦rt ✐s s❡❧❞♦♠ ❢♦✉♥❞ ✐♥ ❝♦♥✈❡♥t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ❜❡❝❛✉s❡ ✐t ✐s ❤❛r❞ t♦ ❝♦❞❡ ❢♦r ❛rr❛②s❀ ✐t ✇♦r❦s ♥✐❝❡❧② ✇✐t❤ ❧✐sts✳ ■t ❞✐✈✐❞❡s t❤❡ ✐♥♣✉t ✭✐❢ ♥♦♥✲tr✐✈✐❛❧✮ ✐♥t♦ t✇♦ r♦✉❣❤❧② ❡q✉❛❧ ♣❛rts✱ s♦rts t❤❡♠ r❡❝✉rs✐✈❡❧②✱ t❤❡♥ ♠❡r❣❡s t❤❡♠✳ ❋✉♥❝t✐♦♥ ♠❡r❣❡ ✐s ♥♦t ✐t❡r❛t✐✈❡❀ t❤❡ r❡❝✉rs✐♦♥ ✐s ❞❡❡♣✳ ❆♥ ✐t❡r❛t✐✈❡ ✈❡rs✐♦♥ ✐s ♦❢ ❧✐tt❧❡ ❜❡♥❡✜t ❢♦r t❤❡ s❛♠❡ r❡❛s♦♥s t❤❛t ❛♣♣❧② t♦ ❛♣♣❡♥❞ ✭▲❡❝t✳ ✹✮✳

  61. ❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✸ Top-down Merge sort fun tmergesort [] = [] | tmergesort [x] = [x] | tmergesort xs = Slide 608 let val k = length xs div 2 in merge(tmergesort (take(xs, k)), tmergesort (drop(xs, k))) end; O ( n log n ) comparisons in worst case 1.4 seconds to sort 10,000 random numbers ▼❡r❣❡s♦rt✬s ❞✐✈✐❞❡ st❛❣❡ ❞✐✈✐❞❡s t❤❡ ✐♥♣✉t ♥♦t ❜② ❝❤♦♦s✐♥❣ ❛ ♣✐✈♦t ✭❛s ✐♥ q✉✐❝❦s♦rt✮ ❜✉t ❜② s✐♠♣❧② ❝♦✉♥t✐♥❣ ♦✉t ❤❛❧❢ ♦❢ t❤❡ ❡❧❡♠❡♥ts✳ ❚❤❡ ❝♦♥q✉❡r st❛❣❡ ❛❣❛✐♥ ✐♥✈♦❧✈❡s r❡❝✉rs✐✈❡ ❝❛❧❧s✱ ❛♥❞ t❤❡ ❝♦♠❜✐♥❡ st❛❣❡ ✐♥✈♦❧✈❡s ♠❡r❣✐♥❣✳ ❋✉♥❝t✐♦♥ t♠❡r❣❡s♦rt t❛❦❡s r♦✉❣❤❧② ✶✳✹ s❡❝♦♥❞s t♦ s♦rt t❤❡ ❧✐st rs ✳ ■♥ t❤❡ ✇♦rst ❝❛s❡✱ ♠❡r❣❡s♦rt ❞♦❡s O ( n log n ) ❝♦♠♣❛r✐s♦♥s✱ ✇✐t❤ t❤❡ s❛♠❡ r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥ ❛s ✐♥ q✉✐❝❦s♦rt✬s ❛✈❡r❛❣❡ ❝❛s❡✳ ❇❡❝❛✉s❡ t❛❦❡ ❛♥❞ ❞r♦♣ ❞✐✈✐❞❡ t❤❡ ✐♥♣✉t ✐♥ t✇♦ ❡q✉❛❧ ♣❛rts ✭t❤❡② ❞✐✛❡r ❛t ♠♦st ❜② ♦♥❡ ❡❧❡♠❡♥t✮✱ ✇❡ ❛❧✇❛②s ❤❛✈❡ T ( n ) = 2 T ( n/ 2) + n ✳ ◗✉✐❝❦s♦rt ✐s ♥❡❛r❧② ✸ t✐♠❡s ❛s ❢❛st ✐♥ t❤❡ ❡①❛♠♣❧❡✳ ❇✉t ✐t r✐s❦s ❛ q✉❛❞r❛t✐❝ ✇♦rst ❝❛s❡✦ ▼❡r❣❡ s♦rt ✐s s❛❢❡ ❜✉t s❧♦✇✳ ❙♦ ✇❤✐❝❤ ❛❧❣♦r✐t❤♠ ✐s ❜❡st❄ ❲❡ ❤❛✈❡ s❡❡♥ ❛ t♦♣✲❞♦✇♥ ♠❡r❣❡s♦rt✳ ❇♦tt♦♠✲✉♣ ❛❧❣♦r✐t❤♠s ❛❧s♦ ❡①✐st✳ ❚❤❡② st❛rt ✇✐t❤ ❛ ❧✐st ♦❢ ♦♥❡✲❡❧❡♠❡♥t ❧✐sts ❛♥❞ r❡♣❡❛t❡❞❧② ♠❡r❣❡ ❛❞❥❛❝❡♥t ❧✐sts ✉♥t✐❧ ♦♥❧② ♦♥❡ ✐s ❧❡❢t✳ ❆ r❡✜♥❡♠❡♥t✱ ✇❤✐❝❤ ❡①♣❧♦✐ts ❛♥② ✐♥✐t✐❛❧ ♦r❞❡r ❛♠♦♥❣ t❤❡ ✐♥♣✉t✱ ✐s t♦ st❛rt ✇✐t❤ ❛ ❧✐st ♦❢ ✐♥❝r❡❛s✐♥❣ ♦r ❞❡❝r❡❛s✐♥❣ r✉♥s ♦❢ ✐♥♣✉t ✐t❡♠s✳

  62. ❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✹ Summary of Sorting Algorithms Optimal is O ( n log n ) comparisons Slide 609 Insertion sort : simple to code; too slow ( quadratic ) [174 secs] Quicksort : fast on average; quadratic in worst case [0.53 secs] Mergesort : optimal in theory; often slower than quicksort [1.4 secs] M ATCH THE ALGORITHM TO THE APPLICATION ◗✉✐❝❦s♦rt✬s ✇♦rst ❝❛s❡ ❝❛♥♥♦t ❜❡ ✐❣♥♦r❡❞✳ ❋♦r ❧❛r❣❡ n ✱ ❛ ❝♦♠♣❧❡①✐t② ♦❢ O ( n 2 ) ✐s ❝❛t❛str♦♣❤✐❝✳ ▼❡r❣❡s♦rt ❤❛s ❛♥ O ( n log n ) ✇♦rst ❝❛s❡ r✉♥♥✐♥❣ t✐♠❡✱ ✇❤✐❝❤ ✐s ♦♣t✐♠❛❧✱ ❜✉t ✐t ✐s t②♣✐❝❛❧❧② s❧♦✇❡r t❤❛♥ q✉✐❝❦s♦rt ❢♦r r❛♥❞♦♠ ❞❛t❛✳ ◆♦♥✲❝♦♠♣❛r✐s♦♥ s♦rt✐♥❣ ❞❡s❡r✈❡s ♠❡♥t✐♦♥✐♥❣✳ ❲❡ ❝❛♥ s♦rt ❛ ❧❛r❣❡ ♥✉♠❜❡r ♦❢ s♠❛❧❧ ✐♥t❡❣❡rs ✉s✐♥❣ t❤❡✐r r❛❞✐① r❡♣r❡s❡♥t❛t✐♦♥ ✐♥ O ( n ) t✐♠❡✳ ❚❤✐s r❡s✉❧t ❞♦❡s ♥♦t ❝♦♥tr❛❞✐❝t t❤❡ ❝♦♠♣❛r✐s♦♥✲❝♦✉♥t✐♥❣ ❛r❣✉♠❡♥t ❜❡❝❛✉s❡ ❝♦♠♣❛r✐s♦♥s ❛r❡ ♥♦t ✉s❡❞ ❛t ❛❧❧✳ ▲✐♥❡❛r t✐♠❡ ✐s ❛❝❤✐❡✈❛❜❧❡ ♦♥❧② ✐❢ t❤❡ ❣r❡❛t❡st ✐♥t❡❣❡r ✐s ✜①❡❞ ✐♥ ❛❞✈❛♥❝❡❀ ❛s n ❣♦❡s t♦ ✐♥✜♥✐t②✱ ✐♥❝r❡❛s✐♥❣❧② ♠❛♥② ♦❢ t❤❡ ✐t❡♠s ❛r❡ t❤❡ s❛♠❡✳ ■t ✐s ❛ s✐♠♣❧❡ s♣❡❝✐❛❧ ❝❛s❡✳ ▼❛♥② ♦t❤❡r s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s ❡①✐st✳ ❲❡ ❤❛✈❡ ♥♦t ❝♦♥s✐❞❡r❡❞ t❤❡ ♣r♦❜✲ ❧❡♠ ♦❢ s♦rt✐♥❣ ❤✉❣❡ ❛♠♦✉♥ts ♦❢ ❞❛t❛ ✉s✐♥❣ ❡①t❡r♥❛❧ st♦r❛❣❡ ♠❡❞✐❛ s✉❝❤ ❛s ♠❛❣♥❡t✐❝ t❛♣❡✳ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✶✵✽✕✶✶✸✳

  63. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✺ An Enumeration Type datatype vehicle = Bike | Motorbike Slide 701 | Car | Lorry; • We have declared a new type , namely vehicle , • . . . along with four new constants . • They are the constructors of the datatype. ❚❤❡ ❞❛t❛t②♣❡ ❞❡❝❧❛r❛t✐♦♥ ❛❞❞s ❛ ♥❡✇ t②♣❡ t♦ ♦✉r ▼▲ s❡ss✐♦♥✳ ❚②♣❡ ✈❡❤✐❝❧❡ ✐s ❛s ❣♦♦❞ ❛s ❛♥② ❜✉✐❧t✲✐♥ t②♣❡ ❛♥❞ ❡✈❡♥ ❛❞♠✐ts ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✳ ❚❤❡ ❢♦✉r ♥❡✇ ✐❞❡♥t✐✜❡rs ♦❢ t②♣❡ ✈❡❤✐❝❧❡ ❛r❡ ❝❛❧❧❡❞ ❝♦♥str✉❝t♦rs ✳ ❲❡ ❝♦✉❧❞ r❡♣r❡s❡♥t t❤❡ ✈❛r✐♦✉s ✈❡❤✐❝❧❡s ❜② t❤❡ ♥✉♠❜❡rs ✵✕✸✳ ❍♦✇❡✈❡r✱ t❤❡ ❝♦❞❡ ✇♦✉❧❞ ❜❡ ❤❛r❞ t♦ r❡❛❞ ❛♥❞ ❡✈❡♥ ❤❛r❞❡r t♦ ♠❛✐♥t❛✐♥✳ ❈♦♥s✐❞❡r ❛❞❞✐♥❣ ❚r✐❝②❝❧❡ ❛s ❛ ♥❡✇ ✈❡❤✐❝❧❡✳■❢ ✇❡ ✇❛♥t❡❞ t♦ ❛❞❞ ✐t ❜❡❢♦r❡ ❇✐❦❡ ✱ t❤❡♥ ❛❧❧ t❤❡ ♥✉♠❜❡rs ✇♦✉❧❞ ❤❛✈❡ t♦ ❜❡ ❝❤❛♥❣❡❞✳ ❯s✐♥❣ ❞❛t❛t②♣❡ ✱ s✉❝❤ ❛❞❞✐t✐♦♥s ❛r❡ tr✐✈✐❛❧ ❛♥❞ t❤❡ ❝♦♠♣✐❧❡r ❝❛♥ ✭❛t ❧❡❛st s♦♠❡t✐♠❡s✮ ✇❛r♥ ✉s ✇❤❡♥ ✐t ❡♥❝♦✉♥t❡rs ❛ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ t❤❛t ❞♦❡s♥✬t ②❡t ❤❛✈❡ ❛ ❝❛s❡ ❢♦r ❚r✐❝②❝❧❡ ✳ ❘❡♣r❡s❡♥t✐♥❣ ✈❡❤✐❝❧❡s ❜② str✐♥❣s ❧✐❦❡ ✧❇✐❦❡✧ ✱ ✧❈❛r✧ ✱ ❡t❝✳✱ ✐s ❛❧s♦ ❜❛❞✳ ❈♦♠♣❛r✐♥❣ str✐♥❣ ✈❛❧✉❡s ✐s s❧♦✇ ❛♥❞ t❤❡ ❝♦♠♣✐❧❡r ❝❛♥✬t ✇❛r♥ ✉s ♦❢ ♠✐s✲ s♣❡❧❧✐♥❣s ❧✐❦❡ ✧▼❖t♦r❜✐❦❡✧ ✿ t❤❡② ✇✐❧❧ ♠❛❦❡ ♦✉r ❝♦❞❡ ❢❛✐❧✳ ▼♦st ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❛❧❧♦✇ t❤❡ ❞❡❝❧❛r❛t✐♦♥ ♦❢ t②♣❡s ❧✐❦❡ ✈❡❤✐❝❧❡ ✳ ❇❡❝❛✉s❡ t❤❡② ❝♦♥s✐st ♦❢ ❛ s❡r✐❡s ♦❢ ✐❞❡♥t✐✜❡rs✱ t❤❡② ❛r❡ ❝❛❧❧❡❞ ❡♥✉♠❡r❛t✐♦♥ t②♣❡s ✳ ❖t❤❡r ❝♦♠♠♦♥ ❡①❛♠♣❧❡s ❛r❡ ❞❛②s ♦❢ t❤❡ ✇❡❡❦ ♦r ❝♦❧♦✉rs✳ ❚❤❡ ❝♦♠♣✐❧❡r ❝❤♦♦s❡s t❤❡ ✐♥t❡❣❡rs ❢♦r ✉s❀ t②♣❡✲❝❤❡❝❦✐♥❣ ♣r❡✈❡♥ts ✉s ❢r♦♠ ❝♦♥❢✉s✐♥❣ ❇✐❦❡ ✇✐t❤ ❘❡❞ ♦r ❙✉♥❞❛② ✳

  64. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✻ Declaring a Function on Vehicles fun wheels Bike = 2 | wheels Motorbike = 2 Slide 702 | wheels Car = 4 | wheels Lorry = 18; > val wheels = fn : vehicle -> int • Datatype constructors can be used in patterns. • Pattern-matching is fast, even complicated nested patterns. ❚❤❡ ❜❡❛✉t② ♦❢ ❞❛t❛t②♣❡ ❞❡❝❧❛r❛t✐♦♥s ✐s t❤❛t t❤❡ ♥❡✇ t②♣❡s ❜❡❤❛✈❡ ❛s ✐❢ t❤❡② ✇❡r❡ ❜✉✐❧t ✐♥t♦ ▼▲✳ ❚②♣❡✲❝❤❡❝❦✐♥❣ ❝❛t❝❤❡s ❝♦♠♠♦♥ ❡rr♦rs✱ s✉❝❤ ❛s ♠✐①✐♥❣ ✉♣ ❞✐✛❡r❡♥t ❞❛t❛t②♣❡s ✐♥ ❛ ❢✉♥❝t✐♦♥ ❧✐❦❡ ✇❤❡❡❧s ✱ ❛s ✇❡❧❧ ❛s ♠✐ss✐♥❣ ❛♥❞ r❡❞✉♥❞❛♥t ♣❛tt❡r♥s✳ ◆♦t❡ ✿ ▼▲ ❞♦❡s ♥♦t ❛❧✇❛②s ❝❛t❝❤ ♠✐ss♣❡❧t ❝♦♥str✉❝t♦rs✳ ■❢ ♦♥❡ ❛♣♣❡❛rs ❛s t❤❡ ❧❛st ♣❛tt❡r♥✱ ✐t ♠✐❣❤t ❜❡ t❛❦❡♥ ❛s ❛ ✈❛r✐❛❜❧❡ ♥❛♠❡✳ ▼② ❜♦♦❦ ❣✐✈❡s ❛♥ ❡①❛♠♣❧❡ ❬✶✸✱ ♣❛❣❡ ✶✸✶❪✳

  65. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✼ A Datatype with Constructor Functions datatype vehicle = Bike | Motorbike of int Slide 703 | Car of bool | Lorry of int; • Constructor functions (like Lorry ) make distinct values . • Different kinds of vehicle can belong to one list: [Bike, Car true, Motorbike 450]; ▼▲ ❣❡♥❡r❛❧✐③❡s t❤❡ ♥♦t✐♦♥ ♦❢ ❡♥✉♠❡r❛t✐♦♥ t②♣❡ t♦ ❛❧❧♦✇ ❞❛t❛ t♦ ❜❡ ❛ss♦✲ ❝✐❛t❡❞ ✇✐t❤ ❡❛❝❤ ❝♦♥str✉❝t♦r✳ ❚❤❡ ❝♦♥str✉❝t♦r ❇✐❦❡ ✐s ❛ ✈❡❤✐❝❧❡ ❛❧❧ ❜② ✐ts❡❧❢✱ ❜✉t t❤❡ ♦t❤❡r t❤r❡❡ ❝♦♥str✉❝t♦rs ❛r❡ ❢✉♥❝t✐♦♥s ❢♦r ❝r❡❛t✐♥❣ ✈❡❤✐❝❧❡s✳ ❙✐♥❝❡ ✇❡ ♠✐❣❤t ✜♥❞ ✐t ❤❛r❞ t♦ r❡♠❡♠❜❡r ✇❤❛t t❤❡ ✈❛r✐♦✉s ✐♥t ❛♥❞ ❜♦♦❧ ❝♦♠♣♦♥❡♥ts ❛r❡ ❢♦r✱ ✐t ✐s ✇✐s❡ t♦ ✐♥❝❧✉❞❡ ❝♦♠♠❡♥ts ✐♥ ❝♦♠♣❧❡① ❞❡❝❧❛r❛t✐♦♥s✳ ■♥ ▼▲✱ ❝♦♠♠❡♥ts ❛r❡ ❡♥❝❧♦s❡❞ ✐♥ t❤❡ ❜r❛❝❦❡ts ✭✯ ❛♥❞ ✯✮ ✳ Pr♦❣r❛♠♠❡rs s❤♦✉❧❞ ❝♦♠♠❡♥t t❤❡✐r ❝♦❞❡ t♦ ❡①♣❧❛✐♥ ❞❡s✐❣♥ ❞❡❝✐s✐♦♥s ❛♥❞ ❦❡② ❢❡❛t✉r❡s ♦❢ t❤❡ ❛❧❣♦r✐t❤♠s ✭s♦♠❡t✐♠❡s ❜② ❝✐t✐♥❣ ❛ r❡❢❡r❡♥❝❡ ✇♦r❦✮✳ ❞❛t❛t②♣❡ ✈❡❤✐❝❧❡ ❂ ❇✐❦❡ ⑤ ▼♦t♦r❜✐❦❡ ♦❢ ✐♥t ✭✯❡♥❣✐♥❡ s✐③❡ ✐♥ ❈❈s✯✮ ⑤ ❈❛r ♦❢ ❜♦♦❧ ✭✯tr✉❡ ✐❢ ❛ ❘❡❧✐❛♥t ❘♦❜✐♥✯✮ ⑤ ▲♦rr② ♦❢ ✐♥t❀ ✭✯♥✉♠❜❡r ♦❢ ✇❤❡❡❧s✯✮ ❚❤❡ ❧✐st s❤♦✇♥ ♦♥ t❤❡ s❧✐❞❡ r❡♣r❡s❡♥ts ❛ ❜✐❝②❝❧❡✱ ❛ ❘❡❧✐❛♥t ❘♦❜✐♥ ❛♥❞ ❛ ❧❛r❣❡ ♠♦t♦r❜✐❦❡✳ ■t ❝❛♥ ❜❡ ❛❧♠♦st s❡❡♥ ❛s ❛ ♠✐①❡❞✲t②♣❡ ❧✐st ❝♦♥t❛✐♥✐♥❣ ✐♥t❡❣❡rs ❛♥❞ ❜♦♦❧❡❛♥s✳ ■t ✐s ❛❝t✉❛❧❧② ❛ ❧✐st ♦❢ ✈❡❤✐❝❧❡s❀ ❞❛t❛t②♣❡s ❧❡ss❡♥ t❤❡ ✐♠♣❛❝t ♦❢ t❤❡ r❡str✐❝t✐♦♥ t❤❛t ❛❧❧ ❧✐st ❡❧❡♠❡♥ts ♠✉st ❤❛✈❡ t❤❡ s❛♠❡ t②♣❡✳

  66. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✽ A Finer Wheel Computation fun wheels Bike = 2 Slide 704 | wheels (Motorbike _) = 2 | wheels (Car robin) = if robin then 3 else 4 | wheels (Lorry w) = w; > val wheels = fn : vehicle -> int ❚❤✐s ❢✉♥❝t✐♦♥ ❝♦♥s✐sts ♦❢ ❢♦✉r ❝❧❛✉s❡s✿ • ❆ ❇✐❦❡ ❤❛s t✇♦ ✇❤❡❡❧s✳ • ❆ ▼♦t♦r❜✐❦❡ ❤❛s t✇♦ ✇❤❡❡❧s✳ • ❆ ❘❡❧✐❛♥t ❘♦❜✐♥ ❤❛s t❤r❡❡ ✇❤❡❡❧s❀ ❛❧❧ ♦t❤❡r ❝❛rs ❤❛✈❡ ❢♦✉r✳ • ❆ ▲♦rr② ❤❛s t❤❡ ♥✉♠❜❡r ♦❢ ✇❤❡❡❧s st♦r❡❞ ✇✐t❤ ✐ts ❝♦♥str✉❝t♦r✳ ❚❤❡r❡ ✐s ♥♦ ♦✈❡r❧❛♣ ❜❡t✇❡❡♥ t❤❡ ▼♦t♦r❜✐❦❡ ❛♥❞ ▲♦rr② ❝❛s❡s✳ ❆❧t❤♦✉❣❤ ▼♦t♦r❜✐❦❡ ❛♥❞ ▲♦rr② ❜♦t❤ ❤♦❧❞ ❛♥ ✐♥t❡❣❡r✱ ▼▲ t❛❦❡s t❤❡ ❝♦♥str✉❝t♦r ✐♥t♦ ❛❝❝♦✉♥t✳ ❆ ▼♦t♦r❜✐❦❡ ✐s ❞✐st✐♥❝t ❢r♦♠ ❛♥② ▲♦rr②✳ ❱❡❤✐❝❧❡s ❛r❡ ♦♥❡ ❡①❛♠♣❧❡ ♦❢ ❛ ❝♦♥❝❡♣t ❝♦♥s✐st✐♥❣ ♦❢ s❡✈❡r❛❧ ✈❛r✐❡t✐❡s ✇✐t❤ ❞✐st✐♥❝t ❢❡❛t✉r❡s✳ ▼♦st ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❝❛♥ r❡♣r❡s❡♥t s✉❝❤ ❝♦♥❝❡♣ts ✉s✐♥❣ s♦♠❡t❤✐♥❣ ❛♥❛❧♦❣♦✉s t♦ ❞❛t❛t②♣❡s✳ ✭❚❤❡② ❛r❡ s♦♠❡t✐♠❡s ❝❛❧❧❡❞ ✉♥✐♦♥ t②♣❡s ♦r ✈❛r✐❛♥t r❡❝♦r❞s ✱ ✇❤♦s❡ t❛❣ ✜❡❧❞s ♣❧❛② t❤❡ r♦❧❡ ♦❢ t❤❡ ❝♦♥str✉❝t♦rs✳✮

  67. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✾ Nested Pattern-Matching fun greener (_, Bike) = false | greener (Bike, _) = true | greener (_, Motorbike _) = false Slide 705 | greener (Motorbike _, _) = true | greener (_, Car _) = false | greener (Car _, _) = true | greener (_, Lorry _) = false; note wildcards in patterns order of evaluation is crucial! ❋♦r ❛♥♦t❤❡r ❡①❛♠♣❧❡ ♦❢ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✱ ❤❡r❡ ✐s ❛ ❢✉♥❝t✐♦♥ t♦ ❝♦♠♣❛r❡ ✈❡❤✐❝❧❡s ❢♦r ❡♥✈✐r♦♥♠❡♥t❛❧ ❢r✐❡♥❞❧✐♥❡ss✳ ❆ ❇✐❦❡ ✐s ❣r❡❡♥❡r t❤❛♥ ❛ ▼♦t♦r❜✐❦❡✱ ✇❤✐❝❤ ✐s ❣r❡❡♥❡r t❤❛♥ ❛ ❈❛r✱ ✇❤✐❝❤ ✐s ❣r❡❡♥❡r t❤❛♥ ❛ ▲♦rr②✳ ❚❤❡ ❝♦❞❡ s❤♦✇♥ ❛❜♦✈❡ ✐s ❝♦♠♣❧✐❝❛t❡❞ ❛♥❞ r❡❧✐❡s ❤❡❛✈✐❧② ♦♥ ▼▲✬s ♦r❞❡r ♦❢ ❡✈❛❧✉❛t✐♦♥✳ ◆♦t❤✲ ✐♥❣ ✐s ❣r❡❡♥❡r t❤❛♥ ❛ ❇✐❦❡❀ ❛ ❇✐❦❡ ✐s ❣r❡❡♥❡r t❤❛♥ ❡✈❡r②t❤✐♥❣ ❡❧s❡❀ ♥♦t❤✐♥❣ ❧❡❢t ✭❇✐❦❡s ❤❛✈❡ ❜❡❡♥ ❞❡❛❧t ✇✐t❤✮ ✐s ❣r❡❡♥❡r t❤❛♥ ❛ ▼♦t♦r❜✐❦❡✱ ❡t❝✳ ❚❤❡ ❛❧t❡r♥❛t✐♥❣ tr✉❡ s ❛♥❞ ❢❛❧s❡ s ♠❛❦❡ t❤❡ ❝♦❞❡ ❤❛r❞ t♦ r❡❛❞✳ ❈❧❡❛r❡r ✐s t♦ ❧✐st ❛❧❧ t❤❡ tr✉❡ ❝❛s❡s ❛♥❞ ❧❡t ♦♥❡ ✇✐❧❞❝❛r❞ ❝❛t❝❤ ❛❧❧ t❤❡ ❢❛❧s❡ ♦♥❡s✳ ❇✉t ✇❤❛t ❤❛♣♣❡♥s ✐♥ t❤✐s st②❧❡ ✐❢ ✇❡ ❛❞❞ ❛ ❢❡✇ ♠♦r❡ ❝♦♥str✉❝t♦rs❄ ❢✉♥ ❣r❡❡♥❡r ✭❇✐❦❡✱ ▼♦t♦r❜✐❦❡ ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ✭❇✐❦❡✱ ❈❛r ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ✭❇✐❦❡✱ ▲♦rr② ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ✭▼♦t♦r❜✐❦❡ ❴✱ ❈❛r ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ✭▼♦t♦r❜✐❦❡ ❴✱ ▲♦rr② ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ✭❈❛r ❴✱ ▲♦rr② ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ❴ ❂ ❢❛❧s❡❀ ❈❧❛✉s❡s t❤❛t ❞❡♣❡♥❞ ✉♣♦♥ t❤❡ ♦r❞❡r ♦❢ ❡✈❛❧✉❛t✐♦♥ ❛r❡ ♥♦t tr✉❡ ❡q✉❛t✐♦♥s✳ ■❢ t❤❡r❡ ❛r❡ ♠❛♥② ❝♦♥str✉❝t♦rs✱ t❤❡ ❜❡st ✇❛② ♦❢ ❝♦♠♣❛r✐♥❣ t❤❡♠ ✐s ❜② ♠❛♣♣✐♥❣ ❜♦t❤ t♦ ✐♥t❡❣❡rs ❛♥❞ ❝♦♠♣❛r✐♥❣ t❤♦s❡ ✭✉s✐♥❣ < ✮✳ ❚❤❡ ♣♦✐♥t t♦ t❛❦❡ ❢r♦♠ t❤✐s ❡①❛♠♣❧❡ ✐s t❤❛t ♣❛tt❡r♥s ♠❛② ❝♦♠❜✐♥❡ ❞❛t❛t②♣❡ ❝♦♥str✉❝t♦rs ✇✐t❤ t✉♣❧❡s✱ ❧✐sts✱ ♥✉♠❜❡rs✱ str✐♥❣s✱ ❡t❝✳ ❚❤❡r❡ ✐s ♥♦ ❧✐♠✐t ♦♥ t❤❡ s✐③❡ ♦❢ ♣❛tt❡r♥s ♦r t❤❡ ♥✉♠❜❡r ♦❢ ❝❧❛✉s❡s ✐♥ ❛ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛✲ t✐♦♥✳ ▼♦st ▼▲ s②st❡♠s ♣❡r❢♦r♠ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣ ❡✣❝✐❡♥t❧②✳

  68. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✵ Error Handling: Exceptions What if a FAULT occurs during a computation? • (Arithmetic overflow or division by zero are hard to predict.) Slide 706 Exception-handling lets us recover gracefully. • Raising an exception abandons the current computation. • Handling the exception attempts an alternative computation. • The raising and handling can be far apart in the code. • Errors of different sorts can be handled separately. ❊①❝❡♣t✐♦♥s ❛r❡ ♥❡❝❡ss❛r② ❜❡❝❛✉s❡ ✐t ✐s ♥♦t ❛❧✇❛②s ♣♦ss✐❜❧❡ t♦ t❡❧❧ ✐♥ ❛❞✲ ✈❛♥❝❡ ✇❤❡t❤❡r ♦r ♥♦t ❛ ❛ s❡❛r❝❤ ✇✐❧❧ ❧❡❛❞ t♦ ❛ ❞❡❛❞ ❡♥❞ ♦r ✇❤❡t❤❡r ❛ ♥✉♠❡r✐❝❛❧ ❝❛❧❝✉❧❛t✐♦♥ ✇✐❧❧ ❡♥❝♦✉♥t❡r ❡rr♦rs s✉❝❤ ❛s ♦✈❡r✢♦✇ ♦r ❞✐✈✐❞❡ ❜② ③❡r♦✳ ❘❛t❤❡r t❤❛♥ ❥✉st ❝r❛s❤✐♥❣✱ ♣r♦❣r❛♠s s❤♦✉❧❞ ❝❤❡❝❦ ✇❤❡t❤❡r t❤✐♥❣s ❤❛✈❡ ❣♦♥❡ ✇r♦♥❣✱ ❛♥❞ ♣❡r❤❛♣s ❛tt❡♠♣t ❛♥ ❛❧t❡r♥❛t✐✈❡ ❝♦♠♣✉t❛t✐♦♥ ✭♣❡r❤❛♣s ✉s✐♥❣ ❛ ❞✐✛❡r✲ ❡♥t ❛❧❣♦r✐t❤♠ ♦r ❤✐❣❤❡r ♣r❡❝✐s✐♦♥✮✳ ❆ ♥✉♠❜❡r ♦❢ ♠♦❞❡r♥ ❧❛♥❣✉❛❣❡s ♣r♦✈✐❞❡ ❡①❝❡♣t✐♦♥ ❤❛♥❞❧✐♥❣✳

  69. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✶ Exceptions in ML exception Failure; Declaring exception NoChange of int; Slide 707 raise Failure Raising raise (NoChange n ) E handle P 1 => E 1 | ... | P n => E n Handling ❊❛❝❤ ❡①❝❡♣t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ ✐♥tr♦❞✉❝❡s ❛ ❞✐st✐♥❝t s♦rt ♦❢ ❡①❝❡♣t✐♦♥✱ ✇❤✐❝❤ ❝❛♥ ❜❡ ❤❛♥❞❧❡❞ s❡♣❛r❛t❡❧② ❢r♦♠ ♦t❤❡rs✳ ❊①❝❡♣t✐♦♥ ♥❛♠❡s ❛r❡ ❝♦♥str✉❝t♦rs ♦❢ t❤❡ s♣❡❝✐❛❧ ❞❛t❛t②♣❡ ❡①♥ ✳ ❚❤✐s ✐s ❛ ♣❡❝✉❧✐❛r✐t② ♦❢ ▼▲ t❤❛t ❧❡ts ❡①❝❡♣t✐♦♥✲ ❤❛♥❞❧❡rs ✉s❡ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✳ ◆♦t❡ t❤❛t ❡①❝❡♣t✐♦♥ ❋❛✐❧✉r❡ ✐s ❥✉st ❛♥ ❡rr♦r ✐♥❞✐❝❛t✐♦♥✱ ✇❤✐❧❡ ◆♦❈❤❛♥❣❡ n ❝❛rr✐❡s ❢✉rt❤❡r ✐♥❢♦r♠❛t✐♦♥✿ t❤❡ ✐♥t❡❣❡r n ✳ ❚❤❡ ❡✛❡❝t ♦❢ r❛✐s❡ E ✐s t♦ ❛❜♦rt ❢✉♥❝t✐♦♥ ❝❛❧❧s r❡♣❡❛t❡❞❧② ✉♥t✐❧ ❡♥❝♦✉♥✲ t❡r✐♥❣ ❛ ❤❛♥❞❧❡r t❤❛t ♠❛t❝❤❡s E ✳ ❚❤❡ ♠❛t❝❤✐♥❣ ❤❛♥❞❧❡r ❝❛♥ ♦♥❧② ❜❡ ❢♦✉♥❞ ❞②✲ ♥❛♠✐❝❛❧❧② ✭❞✉r✐♥❣ ❡①❡❝✉t✐♦♥✮❀ ❝♦♥tr❛st ✇✐t❤ ❤♦✇ ▼▲ ❛ss♦❝✐❛t❡s ♦❝❝✉rr❡♥❝❡s ♦❢ ✐❞❡♥t✐✜❡rs ✇✐t❤ t❤❡✐r ♠❛t❝❤✐♥❣ ❞❡❝❧❛r❛t✐♦♥s✱ ✇❤✐❝❤ ❞♦❡s ♥♦t r❡q✉✐r❡ r✉♥✲ ♥✐♥❣ t❤❡ ♣r♦❣r❛♠✳ ❖♥❡ ❝r✐t✐❝✐s♠ ♦❢ ▼▲✬s ❡①❝❡♣t✐♦♥s ✐s t❤❛t✖✉♥❧✐❦❡ t❤❡ ❏❛✈❛ ❧❛♥❣✉❛❣❡ ✖ ♥♦t❤✐♥❣ ✐♥ ❛ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ ✐♥❞✐❝❛t❡s ✇❤✐❝❤ ❡①❝❡♣t✐♦♥s ✐t ♠✐❣❤t r❛✐s❡✳ ❖♥❡ ❛❧t❡r♥❛t✐✈❡ t♦ ❡①❝❡♣t✐♦♥s ✐s t♦ ✐♥st❡❛❞ r❡t✉r♥ ❛ ✈❛❧✉❡ ♦❢ ❞❛t❛t②♣❡ ♦♣t✐♦♥ ✳ ❞❛t❛t②♣❡ ✬❛ ♦♣t✐♦♥ ❂ ◆❖◆❊ ⑤ ❙❖▼❊ ♦❢ ✬❛❀ ◆❖◆❊ s✐❣♥✐✜❡s ❡rr♦r✱ ✇❤✐❧❡ ❙❖▼❊ x r❡t✉r♥s t❤❡ s♦❧✉t✐♦♥ x ✳ ❚❤✐s ❛♣♣r♦❛❝❤ ❧♦♦❦s ❝❧❡❛♥✱ ❜✉t t❤❡ ❞r❛✇❜❛❝❦ ✐s t❤❛t ♠❛♥② ♣❧❛❝❡s ✐♥ t❤❡ ❝♦❞❡ ✇♦✉❧❞ ❤❛✈❡ t♦ ❝❤❡❝❦ ❢♦r ◆❖◆❊ ✳

  70. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✷ Making Change with Exceptions exception Change; fun change (till, 0) = [] Slide 708 | change ([], amt) = raise Change | change (c::till, amt) = if amt<0 then raise Change else (c :: change(c::till, amt-c)) handle Change => change(till, amt) ; > val change = fn : int list * int -> int list ■♥ ▲❡❝t✳ ✺ ✇❡ ❝♦♥s✐❞❡r❡❞ t❤❡ ♣r♦❜❧❡♠ ♦❢ ♠❛❦✐♥❣ ❝❤❛♥❣❡✳ ❚❤❡ ❣r❡❡❞② ❛❧❣♦r✐t❤♠ ♣r❡s❡♥t❡❞ t❤❡r❡ ❝♦✉❧❞ ♥♦t ❡①♣r❡ss ✻ ✉s✐♥❣ ✺ ❛♥❞ ✷ ❜❡❝❛✉s❡ ✐t ❛❧✇❛②s t♦♦❦ t❤❡ ❧❛r❣❡st ❝♦✐♥✳ ❘❡t✉r♥✐♥❣ t❤❡ ❧✐st ♦❢ ❛❧❧ ♣♦ss✐❜❧❡ s♦❧✉t✐♦♥s ❛✈♦✐❞s t❤❛t ♣r♦❜❧❡♠ r❛t❤❡r ❡①♣❡♥s✐✈❡❧②✿ ✇❡ ♦♥❧② ♥❡❡❞ ♦♥❡ s♦❧✉t✐♦♥✳ ❯s✐♥❣ ❡①❝❡♣t✐♦♥s✱ ✇❡ ❝❛♥ ❝♦❞❡ ❛ ❜❛❝❦tr❛❝❦✐♥❣ ❛❧❣♦r✐t❤♠✿ ♦♥❡ t❤❛t ❝❛♥ ✉♥❞♦ ♣❛st ❞❡❝✐s✐♦♥s ✐❢ ✐t ❝♦♠❡s t♦ ❛ ❞❡❛❞ ❡♥❞✳ ❚❤❡ ❡①❝❡♣t✐♦♥ ❈❤❛♥❣❡ ✐s r❛✐s❡❞ ✐❢ ✇❡ r✉♥ ♦✉t ♦❢ ❝♦✐♥s ✭✇✐t❤ ❛ ♥♦♥✲③❡r♦ ❛♠♦✉♥t✮ ♦r ✐❢ t❤❡ ❛♠♦✉♥t ❣♦❡s ♥❡❣❛t✐✈❡✳ ❲❡ ❛❧✇❛②s tr② t❤❡ ❧❛r❣❡st ❝♦✐♥✱ ❜✉t ❡♥❝❧♦s❡ t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧ ✐♥ ❛♥ ❡①❝❡♣t✐♦♥ ❤❛♥❞❧❡r✱ ✇❤✐❝❤ ✉♥❞♦❡s t❤❡ ❝❤♦✐❝❡ ✐❢ ✐t ❣♦❡s ✇r♦♥❣✳ ❈❛r❡❢✉❧❧② ♦❜s❡r✈❡ ❤♦✇ ❡①❝❡♣t✐♦♥s ✐♥t❡r❛❝t ✇✐t❤ r❡❝✉rs✐♦♥✳ ❚❤❡ ❡①❝❡♣t✐♦♥ ❤❛♥❞❧❡r ❛❧✇❛②s ✉♥❞♦❡s t❤❡ ♠♦st r❡❝❡♥t ❝❤♦✐❝❡✱ ❧❡❛✈✐♥❣ ♦t❤❡rs ♣♦ss✐❜❧② t♦ ❜❡ ✉♥❞♦♥❡ ❧❛t❡r✳ ■❢ ♠❛❦✐♥❣ ❝❤❛♥❣❡ r❡❛❧❧② ✐s ✐♠♣♦ss✐❜❧❡✱ t❤❡♥ ❡✈❡♥t✉❛❧❧② ❡①❝❡♣✲ t✐♦♥ ❈❤❛♥❣❡ ✇✐❧❧ ❜❡ r❛✐s❡❞ ✇✐t❤ ♥♦ ❤❛♥❞❧❡r t♦ ❝❛t❝❤ ✐t✱ ❛♥❞ ✐t ✇✐❧❧ ❜❡ r❡♣♦rt❡❞ ❛t t♦♣ ❧❡✈❡❧✳

  71. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✸ Binary Trees, a Recursive Datatype datatype ’a tree = Lf | Br of ’a * ’a tree * ’a tree Slide 709 1� 2� 3� 4� 5� Br(1, Br(2, Br(4, Lf, Lf), Br(5, Lf, Lf)), Br(3, Lf, Lf)) ❆ ❞❛t❛ str✉❝t✉r❡ ✇✐t❤ ♠✉❧t✐♣❧❡ ❜r❛♥❝❤✐♥❣ ✐s ❝❛❧❧❡❞ ❛ tr❡❡ ✳ ❚r❡❡s ❝❛♥ r❡♣r❡s❡♥t ♠❛t❤❡♠❛t✐❝❛❧ ❡①♣r❡ss✐♦♥s✱ ❧♦❣✐❝❛❧ ❢♦r♠✉❧❛❡✱ ❝♦♠♣✉t❡r ♣r♦❣r❛♠s✱ t❤❡ ♣❤r❛s❡ str✉❝t✉r❡ ♦❢ ❊♥❣❧✐s❤ s❡♥t❡♥❝❡s✱ ❡t❝✳ ❇✐♥❛r② tr❡❡s ❛r❡ ♥❡❛r❧② ❛s ❢✉♥❞❛♠❡♥t❛❧ ❛s ❧✐sts✳ ❚❤❡② ❝❛♥ ♣r♦✈✐❞❡ ❡✣❝✐❡♥t st♦r❛❣❡ ❛♥❞ r❡tr✐❡✈❛❧ ♦❢ ✐♥❢♦r♠❛t✐♦♥✳ ■♥ ❛ ❜✐♥❛r② tr❡❡✱ ❡❛❝❤ ♥♦❞❡ ✐s ❡♠♣t② ✭ Lf ✮✱ ♦r ✐s ❛ ❜r❛♥❝❤ ✭ Br ✮ ✇✐t❤ ❛ ❧❛❜❡❧ ❛♥❞ t✇♦ s✉❜tr❡❡s✳ ▲✐sts t❤❡♠s❡❧✈❡s ❝♦✉❧❞ ❜❡ ❞❡❝❧❛r❡❞ ✉s✐♥❣ ❞❛t❛t②♣❡✿ ❞❛t❛t②♣❡ ✬❛ ❧✐st ❂ ♥✐❧ ⑤ ❝♦♥s ♦❢ ✬❛ ✯ ✬❛ ❧✐st ❲❡ ❝♦✉❧❞ ❡✈❡♥ ❞❡❝❧❛r❡ ✿✿ ❛s ❛♥ ✐♥✜① ❝♦♥str✉❝t♦r ✳ ❚❤❡ ♦♥❧② t❤✐♥❣ ✇❡ ❝♦✉❧❞ ♥♦t ❞❡✜♥❡ ✐s t❤❡ ❬ ✳ ✳ ✳ ❪ ♥♦t❛t✐♦♥✱ ✇❤✐❝❤ ✐s ♣❛rt ♦❢ t❤❡ ▼▲ ❣r❛♠♠❛r✳

  72. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✹ Basic Properties of Binary Trees # of branch nodes fun count Lf = 0 | count(Br(v,t1,t2)) = 1 + count t1 + count t2 Slide 710 fun depth Lf = 0 length of longest path | depth(Br(v,t1,t2)) = 1 + max(depth t1, depth t2) count ( t ) ≤ 2 depth ( t ) − 1 ❋✉♥❝t✐♦♥s ♦♥ tr❡❡s ❛r❡ ❡①♣r❡ss❡❞ r❡❝✉rs✐✈❡❧② ✉s✐♥❣ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✳ ❇♦t❤ ❢✉♥❝t✐♦♥s ❛❜♦✈❡ ❛r❡ ❛♥❛❧♦❣♦✉s t♦ ❧❡♥❣t❤ ♦♥ ❧✐sts✳ ❍❡r❡ ✐s ❛ t❤✐r❞ ♠❡❛s✉r❡ ♦❢ ❛ tr❡❡✬s s✐③❡✿ ❢✉♥ ❧❡❛✈❡s ▲❢ ❂ ✶ ⑤ ❧❡❛✈❡s ✭❇r✭✈✱t✶✱t✷✮✮ ❂ ❧❡❛✈❡s t✶ ✰ ❧❡❛✈❡s t✷❀ ❚❤✐s ❢✉♥❝t✐♦♥ ✐s r❡❞✉♥❞❛♥t ❜❡❝❛✉s❡ ♦❢ ❛ ❜❛s✐❝ ❢❛❝t ❛❜♦✉t tr❡❡s✱ ✇❤✐❝❤ ❝❛♥ ❜❡ ♣r♦✈❡❞ ❜② ✐♥❞✉❝t✐♦♥✿ ❢♦r ❡✈❡r② tr❡❡ t ✱ ✇❡ ❤❛✈❡ ❧❡❛✈❡s ( t ) = ❝♦✉♥t ( t )+1 ✳ ❚❤❡ ✐♥❡q✉❛❧✐t② s❤♦✇♥ ♦♥ t❤❡ s❧✐❞❡ ❛❧s♦ ❤❛s ❛♥ ❡❧❡♠❡♥t❛r② ♣r♦♦❢ ❜② ✐♥❞✉❝t✐♦♥✳ ❆ tr❡❡ ♦❢ ❞❡♣t❤ ✷✵ ❝❛♥ st♦r❡ 2 20 − 1 ♦r ❛♣♣r♦①✐♠❛t❡❧② ♦♥❡ ♠✐❧❧✐♦♥ ❡❧❡♠❡♥ts✳ ❚❤❡ ❛❝❝❡ss ♣❛t❤s t♦ t❤❡s❡ ❡❧❡♠❡♥ts ❛r❡ s❤♦rt✱ ♣❛rt✐❝✉❧❛r❧② ✇❤❡♥ ❝♦♠♣❛r❡❞ ✇✐t❤ ❛ ♠✐❧❧✐♦♥✲❡❧❡♠❡♥t ❧✐st✦

  73. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✺ Traversing Trees (3 Methods) fun preorder Lf = [] | preorder(Br(v,t1,t2)) = [v] @ preorder t1 @ preorder t2; Slide 711 fun inorder Lf = [] | inorder(Br(v,t1,t2)) = inorder t1 @ [v] @ inorder t2; fun postorder Lf = [] | postorder(Br(v,t1,t2)) = postorder t1 @ postorder t2 @ [v]; ❚r❡❡ tr❛✈❡rs❛❧ ♠❡❛♥s ❡①❛♠✐♥✐♥❣ ❡❛❝❤ ♥♦❞❡ ♦❢ ❛ tr❡❡ ✐♥ s♦♠❡ ♦r❞❡r✳ ❉✳ ❊✳ ❑♥✉t❤ ❤❛s ✐❞❡♥t✐✜❡❞ t❤r❡❡ ❢♦r♠s ♦❢ tr❡❡ tr❛✈❡rs❛❧✿ ♣r❡♦r❞❡r✱ ✐♥♦r❞❡r ❛♥❞ ♣♦st♦r❞❡r ❬✶✵❪✳ ❲❡ ❝❛♥ ❝♦❞❡ t❤❡s❡ ❵✈✐s✐t✐♥❣ ♦r❞❡rs✬ ❛s ❢✉♥❝t✐♦♥s t❤❛t ❝♦♥✈❡rt tr❡❡s ✐♥t♦ ❧✐sts ♦❢ ❧❛❜❡❧s✳ ❆❧❣♦r✐t❤♠s ❜❛s❡❞ ♦♥ t❤❡s❡ ♥♦t✐♦♥s t②♣✐❝❛❧❧② ♣❡r❢♦r♠ s♦♠❡ ❛❝t✐♦♥ ❛t ❡❛❝❤ ♥♦❞❡❀ t❤❡ ❢✉♥❝t✐♦♥s ❛❜♦✈❡ s✐♠♣❧② ❝♦♣② t❤❡ ♥♦❞❡s ✐♥t♦ ❧✐sts✳ ❈♦♥s✐❞❡r t❤❡ tr❡❡ ❆ ✴ ❭ ❇ ❈ ✴ ❭ ✴ ❭ ❉ ❊ ❋ ● • ♣r❡♦r❞❡r ✈✐s✐ts t❤❡ ❧❛❜❡❧ ✜rst ✭❵P♦❧✐s❤ ♥♦t❛t✐♦♥✬✮✱ ②✐❡❧❞✐♥❣ ❆❇❉❊❈❋● • ✐♥♦r❞❡r ✈✐s✐ts t❤❡ ❧❛❜❡❧ ♠✐❞✇❛②✱ ②✐❡❧❞✐♥❣ ❉❇❊❆❋❈● • ♣♦st♦r❞❡r ✈✐s✐ts t❤❡ ❧❛❜❡❧ ❧❛st ✭❵❘❡✈❡rs❡ P♦❧✐s❤✬✮✱ ②✐❡❧❞✐♥❣ ❉❊❇❋●❈❆

  74. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✻ Efficiently Traversing Trees fun preord (Lf, vs) = vs | preord (Br(v,t1,t2), vs) = v :: preord (t1, preord (t2, vs)); Slide 712 fun inord (Lf, vs) = vs | inord (Br(v,t1,t2), vs) = inord (t1, v::inord (t2, vs)); fun postord (Lf, vs) = vs | postord (Br(v,t1,t2), vs) = postord (t1, postord (t2, v::vs)); ❯♥❢♦rt✉♥❛t❡❧②✱ t❤❡ ❢✉♥❝t✐♦♥s s❤♦✇♥ ♦♥ t❤❡ ♣r❡✈✐♦✉s s❧✐❞❡ ❛r❡ q✉❛❞r❛t✐❝ ✐♥ t❤❡ ✇♦rst ❝❛s❡✿ t❤❡ ❛♣♣❡♥❞s ✐♥ t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧s ❛r❡ ✐♥❡✣❝✐❡♥t✳ ❚♦ ❝♦rr❡❝t t❤❛t ♣r♦❜❧❡♠✱ ✇❡ ✭❛s ✉s✉❛❧✮ ❛❞❞ ❛♥ ❛❝❝✉♠✉❧❛t✐♥❣ ❛r❣✉♠❡♥t✳ ❖❜s❡r✈❡ ❤♦✇ ❡❛❝❤ ❢✉♥❝t✐♦♥ ❝♦♥str✉❝ts ✐ts r❡s✉❧t ❧✐st ❛♥❞ ❝♦♠♣❛r❡ ✇✐t❤ ❤♦✇ ❛♣♣❡♥❞s ✇❡r❡ ❡❧✐♠✐♥❛t❡❞ ❢r♦♠ q✉✐❝❦s♦rt ✐♥ ▲❡❝t✳ ✻✳ ❖♥❡ ❝❛♥ ♣r♦✈❡ ❡q✉❛t✐♦♥s r❡❧❛t✐♥❣ ❡❛❝❤ ♦❢ t❤❡s❡ ❢✉♥❝t✐♦♥s t♦ ✐ts ❝♦✉♥t❡r♣❛rt ♦♥ t❤❡ ♣r❡✈✐♦✉s s❧✐❞❡✳ ❋♦r ❡①❛♠♣❧❡✱ ✐♥♦r❞ ( t, vs ) = ✐♥♦r❞❡r ( t )@ vs

  75. ❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✼ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✶✷✸✕✶✹✼✳ ❙❤♦✇ t❤❛t t❤❡ ❢✉♥❝t✐♦♥s ♣r❡♦r❞❡r ✱ ✐♥♦r❞❡r ❛♥❞ ♣♦st♦r❞❡r ❊①❡r❝✐s❡ ✼✳✶ ❛❧❧ r❡q✉✐r❡ O ( n 2 ) t✐♠❡ ✐♥ t❤❡ ✇♦rst ❝❛s❡✱ ✇❤❡r❡ n ✐s t❤❡ s✐③❡ ♦❢ t❤❡ tr❡❡✳ ❙❤♦✇ t❤❛t t❤❡ ❢✉♥❝t✐♦♥s ♣r❡♦r❞ ✱ ✐♥♦r❞ ❛♥❞ ♣♦st♦r❞ ❛❧❧ t❛❦❡ ❊①❡r❝✐s❡ ✼✳✷ ❧✐♥❡❛r t✐♠❡ ✐♥ t❤❡ s✐③❡ ♦❢ t❤❡ tr❡❡✳

  76. ❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✽ Dictionaries • lookup : find an item in the dictionary • update : store an item in the dictionary Slide 801 • delete : remove an item from the dictionary • empty : the null dictionary • Missing : exception for errors in lookup and delete Our abstract type supports these operations . . . but hides the implementation! ❆ ❞✐❝t✐♦♥❛r② ✐s ❛ ❞❛t❛ str✉❝t✉r❡ t❤❛t ❛ss♦❝✐❛t❡s ✈❛❧✉❡s t♦ ❝❡rt❛✐♥ ✐❞❡♥✲ t✐✜❡rs✱ ❝❛❧❧❡❞ ❦❡②s ✳ ❲❤❡♥ ❝❤♦♦s✐♥❣ t❤❡ ✐♥t❡r♥❛❧ r❡♣r❡s❡♥t❛t✐♦♥ ❢♦r ❛ ❞❛t❛ str✉❝t✉r❡✱ ✐t ✐s ❡ss❡♥t✐❛❧ t♦ s♣❡❝✐❢② t❤❡ ❢✉❧❧ s❡t ♦❢ ♦♣❡r❛t✐♦♥s t❤❛t ♠✉st ❜❡ s✉♣♣♦rt❡❞✳ ❙❡❧❞♦♠ ✐s ♦♥❡ r❡♣r❡s❡♥t❛t✐♦♥ ❜❡st ❢♦r ❛❧❧ ♣♦ss✐❜❧❡ ❛♣♣❧✐❝❛t✐♦♥s ♦❢ ❛ ❞❛t❛ str✉❝t✉r❡❀ ❡❛❝❤ ✇✐❧❧ s✉♣♣♦rt s♦♠❡ ♦♣❡r❛t✐♦♥s ✇❡❧❧ ❛♥❞ ♦t❤❡rs ❜❛❞❧②✳ ❲❡ ❝♦♥s✐❞❡r s✐♠♣❧❡ ❞✐❝t✐♦♥❛r✐❡s t❤❛t s✉♣♣♦rt ♦♥❧② ✉♣❞❛t❡ ✭❛ss♦❝✐❛t✐♥❣ ❛ ✈❛❧✉❡ ✇✐t❤ ❛♥ ✐❞❡♥t✐✜❡r✮ ❛♥❞ ❧♦♦❦✉♣ ✭s❡❛r❝❤✐♥❣ ❢♦r t❤❡ ✈❛❧✉❡ ❛ss♦❝✐❛t❡❞ ✇✐t❤ ❛♥ ✐❞❡♥t✐✜❡r✮✳ ❖t❤❡r ♦♣❡r❛t✐♦♥s t❤❛t ❝♦✉❧❞ ❜❡ ❝♦♥s✐❞❡r❡❞ ❛r❡ ❞❡❧❡t❡ ✭r❡♠♦✈✐♥❣ ❛♥ ❛ss♦❝✐❛t✐♦♥✮ ❛♥❞ ♠❡r❣❡ ✭❝♦♠❜✐♥✐♥❣ t✇♦ ❞✐❝t✐♦♥❛r✐❡s✮✳ ❙✐♥❝❡ ✇❡ ❛r❡ ♣r♦❣r❛♠♠✐♥❣ ✐♥ ❛ ❢✉♥❝t✐♦♥❛❧ st②❧❡✱ ✉♣❞❛t❡ ✇✐❧❧ ♥♦t ♠♦❞✐❢② t❤❡ ❞❛t❛ str✉❝t✉r❡✳ ■♥st❡❛❞✱ ✐t ✇✐❧❧ r❡t✉r♥ ❛ ♠♦❞✐✜❡❞ ❞❛t❛ str✉❝t✉r❡✳ ❚❤✐s ❝❛♥ ❜❡ ❞♦♥❡ ❡✣❝✐❡♥t❧② ✐❢ ✇❡ ❛r❡ ❝❛r❡❢✉❧ t♦ ❛✈♦✐❞ ❡①❝❡ss✐✈❡ ❝♦♣②✐♥❣✳ ▲♦♦❦✉♣ ❛♥❞ ❞❡❧❡t❡ ❢❛✐❧ ✉♥❧❡ss t❤❡② ✜♥❞ t❤❡ ❞❡s✐r❡❞ ❦❡②✳ ❲❡ ✉s❡ ▼▲✬s ❡①❝❡♣t✐♦♥s t♦ s✐❣♥❛❧ ❢❛✐❧✉r❡✳ ▼♦❞❡r♥ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ♣r♦✈✐❞❡ ❛ ♠❡❛♥s ♦❢ ❞❡❝❧❛r✐♥❣ ❛❜str❛❝t t②♣❡s t❤❛t ❡①♣♦rt ✇❡❧❧✲❞❡✜♥❡❞ ♦♣❡r❛t✐♦♥s ✇❤✐❧❡ ❤✐❞✐♥❣ ❧♦✇✲❧❡✈❡❧ ✐♠♣❧❡♠❡♥✲ t❛t✐♦♥ ❞❡t❛✐❧s s✉❝❤ ❛s t❤❡ ❞❛t❛ str✉❝t✉r❡ ✉s❡❞ t♦ r❡♣r❡s❡♥t ❞✐❝t✐♦♥❛r✐❡s✳ ▼▲ ♣r♦✈✐❞❡s ♠♦❞✉❧❡s ❢♦r t❤✐s ♣✉r♣♦s❡✱ ❜✉t t❤✐s ❝♦✉rs❡ ❞♦❡s ♥♦t ❝♦✈❡r t❤❡♠✳ ✭❚❤❡ ❏❛✈❛ ❝♦✉rs❡ ❝♦✈❡rs ♠♦❞✉❧❛r✐t②✳✮ ❚❤❡r❡❢♦r❡✱ ✇❡ s❤❛❧❧ s✐♠♣❧② ❞❡❝❧❛r❡ t❤❡ ❞✐❝t✐♦✲ ♥❛r② ♦♣❡r❛t✐♦♥s ✐♥❞✐✈✐❞✉❛❧❧② ❛t t♦♣ ❧❡✈❡❧✳ ❲❡ s❤❛❧❧ ❡♥❝♦✉♥t❡r ♠❛♥② ✈❡rs✐♦♥s ♦❢ ❧♦♦❦✉♣ ✱ ❢♦r ❡①❛♠♣❧❡✱ t❤❛t ♦✉❣❤t t♦ ❜❡ ♣❛❝❦❛❣❡❞ ✐♥ s❡♣❛r❛t❡ ♠♦❞✉❧❡s t♦ ♣r❡✈❡♥t ❝❧❛s❤❡s✳

  77. ❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✾ Association Lists: Lists of Pairs exception Missing; fun lookup ([], a) = raise Missing | lookup ((x,y)::pairs, a) = Slide 802 if a=x then y else lookup(pairs, a); > val lookup = fn : (’’a * ’b) list * ’’a -> ’b fun update(l, b, y) = (b,y)::l P ROBLEMS : Linear search is slow. The lists get too long! ❆ ❧✐st ♦❢ ♣❛✐rs ✐s t❤❡ ♠♦st ♦❜✈✐♦✉s r❡♣r❡s❡♥t❛t✐♦♥ ❢♦r ❛ ❞✐❝t✐♦♥❛r②✳ ▲♦♦❦✉♣ ✐s ❜② ❧✐♥❡❛r s❡❛r❝❤✱ ✇❤✐❝❤ ✇❡ ❦♥♦✇ t♦ ❜❡ ♣r♦❤✐❜✐t✐✈❡❧② s❧♦✇✿ O ( n ) ✳ ❆ss♦❝✐❛t✐♦♥ ❧✐sts ❛r❡ ♦♥❧② ✉s❛❜❧❡ ✐❢ t❤❡r❡ ❛r❡ ❢❡✇ ❦❡②s ♦❢ ✐♥t❡r❡st✱ ❛❧✇❛②s ♥❡❛r t❤❡ ❢r♦♥t✳ ❍♦✇❡✈❡r✱ ♥♦t❡ ❧♦♦❦✉♣ ✬s t②♣❡✿ ❛ss♦❝✐❛t✐♦♥ ❧✐sts ✇♦r❦ ❢♦r ❛♥② ❡q✉❛❧✐t② t②♣❡✳ ❚❤✐s ❣❡♥❡r❛❧✐t② ✐s t❤❡✐r ♠❛✐♥ ❛❞✈❛♥t❛❣❡✳ ❚♦ ❡♥t❡r ❛ ♥❡✇ ✭❦❡②✱ ✈❛❧✉❡✮ ❛ss♦❝✐❛t✐♦♥✱ s✐♠♣❧② ♣✉t ❛ ♥❡✇ ♣❛✐r ✐♥t♦ t❤❡ ❧✐st✳ ❚❤✐s t❛❦❡s ❝♦♥st❛♥t t✐♠❡✱ ✇❤✐❝❤ ✐s t❤❡ ❜❡st ✇❡ ❝♦✉❧❞ ❤♦♣❡ ❢♦r✳ ❇✉t t❤❡ s♣❛❝❡ r❡q✉✐r❡♠❡♥t ✐s ❤✉❣❡✳ ■t ✐s ❧✐♥❡❛r ✐♥ t❤❡ ♥✉♠❜❡r ♦❢ ✉♣❞❛t❡s✱ ♥♦t ✐♥ t❤❡ ♥✉♠❜❡r ♦❢ ❞✐st✐♥❝t ❦❡②s✱ ❜❡❝❛✉s❡ ♦❜s♦❧❡t❡ ❡♥tr✐❡s ❛r❡ ♥❡✈❡r ❞❡❧❡t❡❞✳ ❚♦ ❞❡❧❡t❡ ♦❧❞ ❡♥tr✐❡s ✇♦✉❧❞ r❡q✉✐r❡ ✜rst ✜♥❞✐♥❣ t❤❡♠✱ ✐♥❝r❡❛s✐♥❣ t❤❡ ✉♣❞❛t❡ t✐♠❡ ❢r♦♠ O (1) t♦ O ( n ) ✳ ❋✉♥❝t✐♦♥ ❧♦♦❦✉♣ ✐s tr❛❞✐t✐♦♥❛❧❧② ❝❛❧❧❡❞ ❛ss♦❝ ❛❢t❡r ❛ s✐♠✐❧❛r ❢✉♥❝t✐♦♥ ✐♥ t❤❡ ❧❛♥❣✉❛❣❡ ▲✐s♣✱ ✇❤✐❝❤ ♣❧❛②❡❞ ❛ ❤✐st♦r✐❝ r♦❧❡ ✐♥ t❤❡ ❞❡✜♥✐t✐♦♥ ♦❢ t❤❡ ▲✐s♣ ❡✈❛❧✉❛t♦r✳

  78. ❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✵ Binary Search Trees A dictionary associates values (here, numbers) with keys James, 5 Slide 803 Gordon, 4 Thomas, 1 Edward, 2 Henry, 3 Percy, 6 ❇✐♥❛r② s❡❛r❝❤ tr❡❡s ❛r❡ ❛♥ ✐♠♣♦rt❛♥t ❛♣♣❧✐❝❛t✐♦♥ ♦❢ ❜✐♥❛r② tr❡❡s✳ ❚❤❡② ✇♦r❦ ❢♦r ❦❡②s t❤❛t ❤❛✈❡ ❛ t♦t❛❧ ♦r❞❡r✐♥❣✱ s✉❝❤ ❛s str✐♥❣s✳ ❊❛❝❤ ❜r❛♥❝❤ ♦❢ t❤❡ tr❡❡ ❝❛rr✐❡s ❛ ( key, value ) ♣❛✐r❀ ✐ts ❧❡❢t s✉❜tr❡❡ ❤♦❧❞s s♠❛❧❧❡r ❦❡②s❀ t❤❡ r✐❣❤t s✉❜tr❡❡ ❤♦❧❞s ❣r❡❛t❡r ❦❡②s✳ ■❢ t❤❡ tr❡❡ r❡♠❛✐♥s r❡❛s♦♥❛❜❧② ❜❛❧❛♥❝❡❞✱ t❤❡♥ ✉♣❞❛t❡ ❛♥❞ ❧♦♦❦✉♣ ❜♦t❤ t❛❦❡ O (log n ) ❢♦r ❛ tr❡❡ ♦❢ s✐③❡ n ✳ ❚❤❡s❡ t✐♠❡s ❤♦❧❞ ✐♥ t❤❡ ❛✈❡r❛❣❡ ❝❛s❡❀ ❣✐✈❡♥ r❛♥❞♦♠ ❞❛t❛✱ t❤❡ tr❡❡ ✐s ❧✐❦❡❧② t♦ r❡♠❛✐♥ ❜❛❧❛♥❝❡❞✳ ❆t ❛ ❣✐✈❡♥ ♥♦❞❡✱ ❛❧❧ ❦❡②s ✐♥ t❤❡ ❧❡❢t s✉❜tr❡❡ ❛r❡ s♠❛❧❧❡r ✭♦r ❡q✉❛❧✮ ✇❤✐❧❡ ❛❧❧ tr❡❡s ✐♥ t❤❡ r✐❣❤t s✉❜tr❡❡ ❛r❡ ❣r❡❛t❡r✳ ❆♥ ✉♥❜❛❧❛♥❝❡❞ tr❡❡ ❤❛s ❛ ❧✐♥❡❛r ❛❝❝❡ss t✐♠❡ ✐♥ t❤❡ ✇♦rst ❝❛s❡✳ ❊①❛♠♣❧❡s ✐♥❝❧✉❞❡ ❜✉✐❧❞✐♥❣ ❛ tr❡❡ ❜② r❡♣❡❛t❡❞ ✐♥s❡rt✐♦♥s ♦❢ ❡❧❡♠❡♥ts ✐♥ ✐♥❝r❡❛s✐♥❣ ♦r ❞❡❝r❡❛s✐♥❣ ♦r❞❡r❀ t❤❡r❡ ✐s ❛ ❝❧♦s❡ r❡s❡♠❜❧❛♥❝❡ t♦ q✉✐❝❦s♦rt✳ ❇✉✐❧❞✐♥❣ ❛ ❜✐♥❛r② s❡❛r❝❤ tr❡❡✱ t❤❡♥ ❝♦♥✈❡rt✐♥❣ ✐t t♦ ✐♥♦r❞❡r✱ ②✐❡❧❞s ❛ s♦rt✐♥❣ ❛❧❣♦r✐t❤♠ ❝❛❧❧❡❞ tr❡❡s♦rt ✳ ❙❡❧❢✲❜❛❧❛♥❝✐♥❣ tr❡❡s✱ s✉❝❤ ❛s ❘❡❞✲❇❧❛❝❦ tr❡❡s✱ ❛tt❛✐♥ O (log n ) ✐♥ t❤❡ ✇♦rst ❝❛s❡✳ ❚❤❡② ❛r❡ ❝♦♠♣❧✐❝❛t❡❞ t♦ ✐♠♣❧❡♠❡♥t✳

  79. ❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✶ Lookup: Seeks Left or Right exception Missing of string; fun lookup (Br ((a,x),t1,t2), b) = if b < a then lookup(t1, b) Slide 804 else if a < b then lookup(t2, b) else x | lookup (Lf, b) = raise Missing b; > val lookup = fn : (string * ’a) tree * string > -> ’a Guaranteed O (log n ) access time if the tree is balanced! ▲♦♦❦✉♣ ✐♥ t❤❡ ❜✐♥❛r② s❡❛r❝❤ tr❡❡ ❣♦❡s t♦ t❤❡ ❧❡❢t s✉❜tr❡❡ ✐❢ t❤❡ ❞❡s✐r❡❞ ❦❡② ✐s s♠❛❧❧❡r t❤❛♥ t❤❡ ❝✉rr❡♥t ♦♥❡ ❛♥❞ t♦ t❤❡ r✐❣❤t ✐❢ ✐t ✐s ❣r❡❛t❡r✳ ■t r❛✐s❡s ❡①❝❡♣t✐♦♥ ▼✐ss✐♥❣ ✐❢ ✐t ❡♥❝♦✉♥t❡rs ❛♥ ❡♠♣t② tr❡❡✳ ❙✐♥❝❡ ❛♥ ♦r❞❡r✐♥❣ ✐s ✐♥✈♦❧✈❡❞✱ ✇❡ ❤❛✈❡ t♦ ❞❡❝❧❛r❡ t❤❡ ❢✉♥❝t✐♦♥s ❢♦r ❛ s♣❡❝✐✜❝ t②♣❡✱ ❤❡r❡ str✐♥❣ ✳ ◆♦✇ ❡①❝❡♣t✐♦♥ ▼✐ss✐♥❣ ♠❡♥t✐♦♥s t❤❛t t②♣❡✿ ✐❢ ❧♦♦❦✉♣ ❢❛✐❧s✱ t❤❡ ❡①❝❡♣t✐♦♥ r❡t✉r♥s t❤❡ ♠✐ss✐♥❣ ❦❡②✳ ❚❤❡ ❡①❝❡♣t✐♦♥ ❝♦✉❧❞ ❜❡ ❡❧✐♠✐♥❛t❡❞ ✉s✐♥❣ t②♣❡ ♦♣t✐♦♥ ♦❢ ▲❡❝t✳ ✼✱ ✉s✐♥❣ t❤❡ ❝♦♥str✉❝t♦r ◆❖◆❊ ❢♦r ❢❛✐❧✉r❡✳

  80. ❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✷ Update fun update (Lf, b:string, y) = Br((b,y), Lf, Lf) | update (Br((a,x),t1,t2), b, y) = if b<a Slide 805 then Br ((a,x), update(t1,b,y), t2) else if a<b then Br ((a,x), t1, update(t2,b,y)) else (*a=b*) Br ((a,y),t1,t2); Also O (log n ) : it copies the path only, not whole subtrees! ❚❤❡ ✉♣❞❛t❡ ♦♣❡r❛t✐♦♥ ✐s ❛ ♥✐❝❡ ♣✐❡❝❡ ♦❢ ❢✉♥❝t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣✳ ■t s❡❛r❝❤❡s ✐♥ t❤❡ s❛♠❡ ♠❛♥♥❡r ❛s ❧♦♦❦✉♣ ✱ ❜✉t t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧s r❡❝♦♥str✉❝t ❛ ♥❡✇ tr❡❡ ❛r♦✉♥❞ t❤❡ r❡s✉❧t ♦❢ t❤❡ ✉♣❞❛t❡✳ ❖♥❡ s✉❜tr❡❡ ✐s ✉♣❞❛t❡❞ ❛♥❞ t❤❡ ♦t❤❡r ❧❡❢t ✉♥❝❤❛♥❣❡❞✳ ❚❤❡ ✐♥t❡r♥❛❧ r❡♣r❡s❡♥t❛t✐♦♥ ♦❢ tr❡❡s ❡♥s✉r❡s t❤❛t ✉♥❝❤❛♥❣❡❞ ♣❛rts ♦❢ t❤❡ tr❡❡ ❛r❡ ♥♦t ❝♦♣✐❡❞✱ ❜✉t s❤❛r❡❞ ✳ ✭▲❡❝t✳ ✶✺ ✇✐❧❧ ❞✐s❝✉ss ✉s✐♥❣ r❡❢❡r❡♥❝❡s t♦ ❝r❡❛t❡ ❧✐♥❦❡❞ str✉❝t✉r❡s✳✮ ❚❤❡r❡❢♦r❡✱ ✉♣❞❛t❡ ❝♦♣✐❡s ♦♥❧② t❤❡ ♣❛t❤ ❢r♦♠ t❤❡ r♦♦t t♦ t❤❡ ♥❡✇ ♥♦❞❡✳ ■ts t✐♠❡ ❛♥❞ s♣❛❝❡ r❡q✉✐r❡♠❡♥ts✱ ❢♦r ❛ r❡❛s♦♥❛❜❧② ❜❛❧❛♥❝❡❞ tr❡❡✱ ❛r❡ ❜♦t❤ O (log n ) ✳ ❚❤❡ ❝♦♠♣❛r✐s♦♥ ❜❡t✇❡❡♥ b ❛♥❞ a ❛❧❧♦✇s t❤r❡❡ ❝❛s❡s✿ • s♠❛❧❧❡r ✿ ✉♣❞❛t❡ t❤❡ ❧❡❢t s✉❜tr❡❡❀ s❤❛r❡ t❤❡ r✐❣❤t • ❣r❡❛t❡r ✿ ✉♣❞❛t❡ t❤❡ r✐❣❤t s✉❜tr❡❡❀ s❤❛r❡ t❤❡ ❧❡❢t • ❡q✉❛❧ ✿ ✉♣❞❛t❡ t❤❡ ❧❛❜❡❧ ❛♥❞ s❤❛r❡ ❜♦t❤ s✉❜tr❡❡s ◆♦t❡✿ ✐♥ t❤❡ ❢✉♥❝t✐♦♥ ❞❡✜♥✐t✐♦♥✱ ✭✯❛❂❜✯✮ ✐s ❛ ❝♦♠♠❡♥t✳ ❈♦♠♠❡♥ts ✐♥ ▼▲ ❛r❡ ❡♥❝❧♦s❡❞ ✐♥ t❤❡ ❜r❛❝❦❡ts ✭✯ ❛♥❞ ✯✮ ✳

  81. ❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✸ Arrays A conventional array is an indexed storage area. • It is updated in place by the command A[k] := x Slide 806 • The concept is inherently imperative : updating is an action. A functional Array is a finite map from integers to data. • Updating is copying in update(A,k,x) • The new array equals A except at position k . Can we do updates efficiently? ❚❤❡ ❡❧❡♠❡♥ts ♦❢ ❛ ❧✐st ❝❛♥ ♦♥❧② ❜❡ r❡❛❝❤❡❞ ❜② ❝♦✉♥t✐♥❣ ❢r♦♠ t❤❡ ❢r♦♥t✳ ❊❧❡♠❡♥ts ♦❢ ❛ tr❡❡ ❛r❡ r❡❛❝❤❡❞ ❜② ❢♦❧❧♦✇✐♥❣ ❛ ♣❛t❤ ❢r♦♠ t❤❡ r♦♦t✳ ❆♥ ❛r✲ r❛② ❤✐❞❡s s✉❝❤ str✉❝t✉r❛❧ ♠❛tt❡rs❀ ✐ts ❡❧❡♠❡♥ts ❛r❡ ✉♥✐❢♦r♠❧② ❞❡s✐❣♥❛t❡❞ ❜② ♥✉♠❜❡r✳ ■♠♠❡❞✐❛t❡ ❛❝❝❡ss t♦ ❛r❜✐tr❛r② ♣❛rts ♦❢ ❛ ❞❛t❛ str✉❝t✉r❡ ✐s ❝❛❧❧❡❞ r❛♥❞♦♠ ❛❝❝❡ss ✳ ❆rr❛②s ❛r❡ t❤❡ ❞♦♠✐♥❛♥t ❞❛t❛ str✉❝t✉r❡ ✐♥ ❝♦♥✈❡♥t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✳ ❚❤❡ ✐♥❣❡♥✐♦✉s ✉s❡ ♦❢ ❛rr❛②s ✐s t❤❡ ❦❡② t♦ ♠❛♥② ♦❢ t❤❡ ❣r❡❛t ❝❧❛ss✐❝❛❧ ❛❧❣♦r✐t❤♠s✱ s✉❝❤ ❛s ❍♦❛r❡✬s ♦r✐❣✐♥❛❧ q✉✐❝❦s♦rt ✭t❤❡ ♣❛rt✐t✐♦♥ st❡♣✮ ❛♥❞ ❲❛rs❤❛❧❧✬s tr❛♥s✐t✐✈❡✲❝❧♦s✉r❡ ❛❧❣♦r✐t❤♠✳ ❚❤❡ ❞r❛✇❜❛❝❦ ✐s t❤❛t s✉❜s❝r✐♣t✐♥❣ ✐s ❛ ❝❤✐❡❢ ❝❛✉s❡ ♦❢ ♣r♦❣r❛♠♠❡r ❡rr♦r✳ ❚❤❛t ✐s ✇❤② ❛rr❛②s ♣❧❛② ❧✐tt❧❡ r♦❧❡ ✐♥ t❤✐s ✐♥tr♦❞✉❝t♦r② ❝♦✉rs❡✳ ❋✉♥❝t✐♦♥❛❧ ❛rr❛②s ❛r❡ ❞❡s❝r✐❜❡❞ ❜❡❧♦✇ ✐♥ ♦r❞❡r t♦ ✐❧❧✉str❛t❡ ❛♥♦t❤❡r ✇❛② ♦❢ ✉s✐♥❣ tr❡❡s t♦ ♦r❣❛♥✐③❡ ❞❛t❛✳ ❍❡r❡ ✐s ❛ s✉♠♠❛r② ♦❢ ♦✉r ❞✐❝t✐♦♥❛r② ❞❛t❛ str✉❝t✉r❡s ✐♥ ♦r❞❡r ♦❢ ❞❡❝r❡❛s✐♥❣ ❣❡♥❡r❛❧✐t② ❛♥❞ ✐♥❝r❡❛s✐♥❣ ❡✣❝✐❡♥❝②✿ • ▲✐♥❡❛r s❡❛r❝❤ ✿ ▼♦st ❣❡♥❡r❛❧✱ ♥❡❡❞✐♥❣ ♦♥❧② ❡q✉❛❧✐t② ♦♥ ❦❡②s✱ ❜✉t ✐♥❡✣✲ ❝✐❡♥t✿ ❧✐♥❡❛r t✐♠❡✳ • ❇✐♥❛r② s❡❛r❝❤ ✿ ◆❡❡❞s ❛♥ ♦r❞❡r✐♥❣ ♦♥ ❦❡②s✳ ▲♦❣❛r✐t❤♠✐❝ ❛❝❝❡ss t✐♠❡ ✐♥ t❤❡ ❛✈❡r❛❣❡ ❝❛s❡✱ ❧✐♥❡❛r ✐♥ t❤❡ ✇♦rst ❝❛s❡✳ • ❆rr❛② s✉❜s❝r✐♣t✐♥❣ ✿ ▲❡❛st ❣❡♥❡r❛❧✱ r❡q✉✐r✐♥❣ ❦❡②s t♦ ❜❡ ✐♥t❡❣❡rs✱ ❜✉t ❡✈❡♥ ✇♦rst✲❝❛s❡ t✐♠❡ ✐s ❧♦❣❛r✐t❤♠✐❝✳

  82. ❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✹ Functional Arrays as Binary Trees The path to an element follows the binary code for its subscript. 1� Slide 807 2� 3� 4� 6� 5� 7� 8� 12� 10� 14� 9� 13� 11� 15� ❚❤✐s s✐♠♣❧❡ r❡♣r❡s❡♥t❛t✐♦♥ ✭❝r❡❞✐t❡❞ t♦ ❲✳ ❇r❛✉♥✮ ❡♥s✉r❡s t❤❛t t❤❡ tr❡❡ ✐s ❜❛❧❛♥❝❡❞✳ ❈♦♠♣❧❡①✐t② ♦❢ ❛❝❝❡ss ✐s ❛❧✇❛②s O (log n ) ✱ ✇❤✐❝❤ ✐s ♦♣t✐♠❛❧✳ ❋♦r ❛❝t✉❛❧ r✉♥♥✐♥❣ t✐♠❡✱ ❛❝❝❡ss t♦ ❝♦♥✈❡♥t✐♦♥❛❧ ❛rr❛②s ✐s ♠✉❝❤ ❢❛st❡r✿ ✐t r❡q✉✐r❡s ♦♥❧② ❛ ❢❡✇ ❤❛r❞✇❛r❡ ✐♥str✉❝t✐♦♥s✳ ❆rr❛② ❛❝❝❡ss ✐s ♦❢t❡♥ t❛❦❡♥ t♦ ❜❡ O (1) ✱ ✇❤✐❝❤ ✭❛s ❛❧✇❛②s✮ ♣r❡s✉♠❡s t❤❛t ❤❛r❞✇❛r❡ ❧✐♠✐ts ❛r❡ ♥❡✈❡r ❡①❝❡❡❞❡❞✳ ❚❤❡ ❧♦✇❡r ❜♦✉♥❞ ❢♦r ❛rr❛② ✐♥❞✐❝❡s ✐s ♦♥❡✳ ❚❤❡ ✉♣♣❡r ❜♦✉♥❞ st❛rts ❛t ③❡r♦ ✭✇❤✐❝❤ s✐❣♥✐✜❡s t❤❡ ❡♠♣t② ❛rr❛②✮ ❛♥❞ ❝❛♥ ❣r♦✇ ✇✐t❤♦✉t ❧✐♠✐t✳ ❚❤✐s ❞❛t❛ str✉❝t✉r❡ ❝❛♥ ❜❡ ✉s❡❞ t♦ ✐♠♣❧❡♠❡♥t ❛rr❛②s t❤❛t ❣r♦✇ ❛♥❞ s❤r✐♥❦ ❜② ❛❞❞✐♥❣ ❛♥❞ ❞❡❧❡t✐♥❣ ❡❧❡♠❡♥ts ❛t ❡✐t❤❡r ❡♥❞✳

  83. ❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✺ The Lookup Function exception Subscript; Slide 808 fun sub (Lf, _) = raise Subscript (*Not found!*) | sub (Br(v,t1,t2), k) = if k=1 then v else if k mod 2 = 0 then sub (t1, k div 2) else sub (t2, k div 2); ❚❤❡ ❧♦♦❦✉♣ ❢✉♥❝t✐♦♥✱ s✉❜ ✱ ❞✐✈✐❞❡s t❤❡ s✉❜s❝r✐♣t ❜② ✷ ✉♥t✐❧ ✶ ✐s r❡❛❝❤❡❞✳ ■❢ t❤❡ r❡♠❛✐♥❞❡r ✐s ✵ t❤❡♥ t❤❡ ❢✉♥❝t✐♦♥ ❢♦❧❧♦✇s t❤❡ ❧❡❢t s✉❜tr❡❡✱ ♦t❤❡r✇✐s❡ t❤❡ r✐❣❤t✳ ■❢ ✐t r❡❛❝❤❡s ❛ ❧❡❛❢✱ ✐t s✐❣♥❛❧s ❡rr♦r ❜② r❛✐s✐♥❣ ❡①❝❡♣t✐♦♥ ❙✉❜s❝r✐♣t ✳ ❆rr❛② ❛❝❝❡ss ❝❛♥ ❛❧s♦ ❜❡ ✉♥❞❡rst❛♥❞ ✐♥ t❡r♠s ♦❢ t❤❡ s✉❜s❝r✐♣t✬s ❜✐♥❛r② ❝♦❞❡✳ ❇❡❝❛✉s❡ t❤❡ s✉❜s❝r✐♣t ♠✉st ❜❡ ❛ ♣♦s✐t✐✈❡ ✐♥t❡❣❡r✱ ✐♥ ❜✐♥❛r② ✐t ❤❛s ❛ ❧❡❛❞✐♥❣ ♦♥❡✳ ❉✐s❝❛r❞ t❤✐s ♦♥❡ ❛♥❞ r❡✈❡rs❡ t❤❡ r❡♠❛✐♥✐♥❣ ❜✐ts✳ ■♥t❡r♣r❡t✐♥❣ ③❡r♦ ❛s ❧❡❢t ❛♥❞ ♦♥❡ ❛s r✐❣❤t ②✐❡❧❞s t❤❡ ♣❛t❤ ❢r♦♠ t❤❡ r♦♦t t♦ t❤❡ s✉❜s❝r✐♣t✳ P♦♣✉❧❛r ❧✐t❡r❛t✉r❡ ♦❢t❡♥ ❡①♣❧❛✐♥s t❤❡ ✐♠♣♦rt❛♥❝❡ ♦❢ ❜✐♥❛r② ❛s ❜❡✐♥❣ ❧❡❞ ❜② ❤❛r❞✇❛r❡✿ ❜❡❝❛✉s❡ ❛ ❝✐r❝✉✐t ✐s ❡✐t❤❡r ♦♥ ♦r ♦✛✳ ❚❤❡ tr✉t❤ ✐s ❛❧♠♦st t❤❡ ♦♣♣♦s✐t❡✳ ❉❡s✐❣♥❡rs ♦❢ ❞✐❣✐t❛❧ ❡❧❡❝tr♦♥✐❝s ❣♦ t♦ ❛ ❧♦t ♦❢ tr♦✉❜❧❡ t♦ s✉♣♣r❡ss t❤❡ ❝♦♥t✐♥✉♦✉s ❜❡❤❛✈✐♦✉r t❤❛t ✇♦✉❧❞ ♥❛t✉r❛❧❧② ❛r✐s❡✳ ❚❤❡ r❡❛❧ r❡❛s♦♥ ✇❤② ❜✐♥❛r② ✐s ✐♠♣♦rt❛♥t ✐s ✐ts r♦❧❡ ✐♥ ❛❧❣♦r✐t❤♠s✿ ❛♥ ✐❢ ✲ t❤❡♥ ✲ ❡❧s❡ ❞❡❝✐s✐♦♥ ❧❡❛❞s t♦ ❜✐♥❛r② ❜r❛♥❝❤✐♥❣✳ ❉❛t❛ str✉❝t✉r❡s✱ s✉❝❤ ❛s tr❡❡s✱ ❛♥❞ ❛❧❣♦r✐t❤♠s✱ s✉❝❤ ❛s ♠❡r❣❡s♦rt✱ ✉s❡ ❜✐♥❛r② ❜r❛♥❝❤✐♥❣ ✐♥ ♦r❞❡r t♦ r❡❞✉❝❡ ❛ ❝♦st ❢r♦♠ O ( n ) t♦ O (log n ) ✳ ❚✇♦ ✐s t❤❡ s♠❛❧❧❡st ✐♥t❡❣❡r ❞✐✈✐s♦r t❤❛t ❛❝❤✐❡✈❡s t❤✐s r❡❞✉❝t✐♦♥✳ ✭▲❛r❣❡r ❞✐✈✐s♦rs ❛r❡ ♦♥❧② ♦❝❝❛s✐♦♥❛❧❧② ❤❡❧♣❢✉❧✱ ❛s ✐♥ t❤❡ ❝❛s❡ ♦❢ ❇✲tr❡❡s✱ ✇❤❡r❡ t❤❡② r❡❞✉❝❡ t❤❡ ❝♦♥st❛♥t ❢❛❝t♦r✳✮ ❚❤❡ s✐♠♣❧✐❝✐t② ♦❢ ❜✐♥❛r② ❛r✐t❤♠❡t✐❝ ❝♦♠♣❛r❡❞ ✇✐t❤ ❞❡❝✐♠❛❧ ❛r✐t❤♠❡t✐❝ ✐s ❥✉st ❛♥♦t❤❡r ✐♥st❛♥❝❡ ♦❢ t❤❡ s✐♠♣❧✐❝✐t② ♦❢ ❛❧❣♦r✐t❤♠s ❜❛s❡❞ ♦♥ ❜✐♥❛r② ❝❤♦✐❝❡s✳

  84. ❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✻ The Update Function fun update (Lf, k, w) = if k = 1 then Br (w, Lf, Lf) Slide 809 else raise Subscript (*Gap in tree!*) | update (Br(v,t1,t2), k, w) = if k = 1 then Br (w, t1, t2) else if k mod 2 = 0 then Br (v, update(t1, k div 2, w), t2) else Br (v, t1, update(t2, k div 2, w)) ❚❤❡ ✉♣❞❛t❡ ❢✉♥❝t✐♦♥✱ ✉♣❞❛t❡ ✱ ❛❧s♦ ❞✐✈✐❞❡s t❤❡ s✉❜s❝r✐♣t r❡♣❡❛t❡❞❧② ❜② t✇♦✳ ❲❤❡♥ ✐t r❡❛❝❤❡s ❛ ✈❛❧✉❡ ♦❢ ♦♥❡✱ ✐t ❤❛s ✐❞❡♥t✐✜❡❞ t❤❡ ❡❧❡♠❡♥t ♣♦s✐t✐♦♥✳ ❚❤❡♥ ✐t r❡♣❧❛❝❡s t❤❡ ❜r❛♥❝❤ ♥♦❞❡ ❜② ❛♥♦t❤❡r ❜r❛♥❝❤ ✇✐t❤ t❤❡ ♥❡✇ ❧❛❜❡❧✳ ❆ ❧❡❛❢ ♠❛② ❜❡ r❡♣❧❛❝❡❞ ❜② ❛ ❜r❛♥❝❤✱ ❡①t❡♥❞✐♥❣ t❤❡ ❛rr❛②✱ ♣r♦✈✐❞❡❞ ♥♦ ✐♥t❡r✈❡♥✐♥❣ ♥♦❞❡s ❤❛✈❡ t♦ ❜❡ ❣❡♥❡r❛t❡❞✳ ❚❤✐s s✉✣❝❡s ❢♦r ❛rr❛②s ✇✐t❤♦✉t ❣❛♣s ✐♥ t❤❡✐r s✉❜s❝r✐♣t✐♥❣✳ ✭❚❤❡ ❞❛t❛ str✉❝t✉r❡ ❝❛♥ ❜❡ ♠♦❞✐✜❡❞ t♦ ❛❧❧♦✇ s♣❛rs❡ ❛rr❛②s✱ ✇❤❡r❡ ♠♦st s✉❜s❝r✐♣t ♣♦s✐t✐♦♥s ❛r❡ ✉♥❞❡✜♥❡❞✳✮ ❊①❝❡♣t✐♦♥ ❙✉❜s❝r✐♣t ✐♥❞✐❝❛t❡s t❤❛t t❤❡ s✉❜s❝r✐♣t ♣♦s✐t✐♦♥ ❞♦❡s ♥♦t ❡①✐st ❛♥❞ ❝❛♥♥♦t ❜❡ ❝r❡❛t❡❞✳ ❚❤✐s ✉s❡ ♦❢ ❡①❝❡♣t✐♦♥s ✐s ♥♦t ❡❛s✐❧② r❡♣❧❛❝❡❞ ❜② ◆❖◆❊ ❛♥❞ ❙❖▼❊ ✳ ◆♦t❡ t❤❛t t❤❡r❡ ❛r❡ t✇♦ t❡sts ✐♥✈♦❧✈✐♥❣ k = 1 ✳ ■❢ ✇❡ ❤❛✈❡ r❡❛❝❤❡❞ ❛ ❧❡❛❢❀ ✐t r❡t✉r♥s ❛ ❜r❛♥❝❤✱ ❡①t❡♥❞✐♥❣ t❤❡ ❛rr❛② ❜② ♦♥❡✳ ■❢ ✇❡ ❛r❡ st✐❧❧ ❛t ❛ ❜r❛♥❝❤ ♥♦❞❡✱ t❤❡♥ t❤❡ ❡✛❡❝t ✐s t♦ ✉♣❞❛t❡ ❛♥ ❡①✐st✐♥❣ ❛rr❛② ❡❧❡♠❡♥t✳ ❆ s✐♠✐❧❛r ❢✉♥❝t✐♦♥ ❝❛♥ s❤r✐♥❦ ❛♥ ❛rr❛② ❜② ♦♥❡✳ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✶✹✽✕✶✺✾✳

  85. ■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✼ Breadth-First v Depth-First Tree Traversal binary trees as decision trees Slide 901 Look for solution nodes • Depth-first : search one subtree in full before moving on • Breadth-first: search all nodes at level k before moving to k + 1 Finds all solutions — nearest first! Pr❡♦r❞❡r✱ ✐♥♦r❞❡r ❛♥❞ ♣♦st♦r❞❡r tr❡❡ tr❛✈❡rs❛❧s ❛❧❧ ❤❛✈❡ s♦♠❡t❤✐♥❣ ✐♥ ❝♦♠♠♦♥✿ t❤❡② ❛r❡ ❞❡♣t❤✲✜rst ✳ ❆t ❡❛❝❤ ♥♦❞❡✱ t❤❡ ❧❡❢t s✉❜tr❡❡ ✐s ❡♥t✐r❡❧② tr❛✈❡rs❡❞ ❜❡❢♦r❡ t❤❡ r✐❣❤t s✉❜tr❡❡✳ ❉❡♣t❤✲✜rst tr❛✈❡rs❛❧s ❛r❡ ❡❛s② t♦ ❝♦❞❡ ❛♥❞ ❝❛♥ ❜❡ ❡✣❝✐❡♥t✱ ❜✉t t❤❡② ❛r❡ ✐❧❧✲s✉✐t❡❞ ❢♦r s♦♠❡ ♣r♦❜❧❡♠s✳ ❙✉♣♣♦s❡ t❤❡ tr❡❡ r❡♣r❡s❡♥ts t❤❡ ♣♦ss✐❜❧❡ ♠♦✈❡s ✐♥ ❛ ♣✉③③❧❡✱ ❛♥❞ t❤❡ ♣✉r✲ ♣♦s❡ ♦❢ t❤❡ tr❛✈❡rs❛❧ ✐s t♦ s❡❛r❝❤ ❢♦r ❛ ♥♦❞❡ ❝♦♥t❛✐♥✐♥❣ ❛ s♦❧✉t✐♦♥✳ ❚❤❡♥ ❛ ❞❡♣t❤✲✜rst tr❛✈❡rs❛❧ ♠❛② ✜♥❞ ♦♥❡ s♦❧✉t✐♦♥ ♥♦❞❡ ❞❡❡♣ ✐♥ t❤❡ ❧❡❢t s✉❜tr❡❡✱ ✇❤❡♥ ❛♥♦t❤❡r s♦❧✉t✐♦♥ ✐s ❛t t❤❡ ✈❡r② t♦♣ ♦❢ t❤❡ r✐❣❤t s✉❜tr❡❡✳ ❖❢t❡♥ ✇❡ ✇❛♥t t❤❡ s❤♦rt❡st ♣❛t❤ t♦ ❛ s♦❧✉t✐♦♥✳ ❙✉♣♣♦s❡ t❤❡ tr❡❡ ✐s ✐♥✜♥✐t❡ ✳ ✭❚❤❡ ▼▲ ❞❛t❛t②♣❡ tr❡❡ ❝♦♥t❛✐♥s ♦♥❧② ✜♥✐t❡ tr❡❡s✱ ❜✉t ▼▲ ❝❛♥ r❡♣r❡s❡♥t ✐♥✜♥✐t❡ tr❡❡s ❜② ♠❡❛♥s ❞✐s❝✉ss❡❞ ✐♥ ▲❡❝t✳ ✶✸✳✮ ❉❡♣t❤✲✜rst s❡❛r❝❤ ✐s ❛❧♠♦st ✉s❡❧❡ss ✇✐t❤ ✐♥✜♥✐t❡ tr❡❡s✱ ❢♦r ✐❢ t❤❡ ❧❡❢t s✉❜tr❡❡ ✐s ✐♥✜♥✐t❡ t❤❡♥ ✐t ✇✐❧❧ ♥❡✈❡r r❡❛❝❤ t❤❡ r✐❣❤t s✉❜tr❡❡✳ ❆ ❜r❡❛❞t❤✲✜rst tr❛✈❡rs❛❧ ❡①♣❧♦r❡s t❤❡ ♥♦❞❡s ❤♦r✐③♦♥t❛❧❧② r❛t❤❡r t❤❛♥ ✈❡r✲ t✐❝❛❧❧②✳ ❲❤❡♥ ✈✐s✐t✐♥❣ ❛ ♥♦❞❡✱ ✐t ❞♦❡s ♥♦t tr❛✈❡rs❡ t❤❡ s✉❜tr❡❡s ✉♥t✐❧ ✐t ❤❛s ✈✐s✐t❡❞ ❛❧❧ ♦t❤❡r ♥♦❞❡s ❛t t❤❡ ❝✉rr❡♥t ❞❡♣t❤✳ ❚❤✐s ✐s ❡❛s✐❧② ✐♠♣❧❡♠❡♥t❡❞ ❜② ❦❡❡♣✐♥❣ ❛ ❧✐st ♦❢ tr❡❡s t♦ ✈✐s✐t✳ ■♥✐t✐❛❧❧②✱ t❤✐s ❧✐st ❝♦♥s✐sts ♦❢ ♦♥❡ ❡❧❡♠❡♥t✿ t❤❡ ❡♥t✐r❡ tr❡❡✳ ❊❛❝❤ ✐t❡r❛t✐♦♥ r❡♠♦✈❡s ❛ tr❡❡ ❢r♦♠ t❤❡ ❤❡❛❞ ♦❢ t❤❡ ❧✐st ❛♥❞ ❛❞❞s ✐ts s✉❜tr❡❡s ❛❢t❡r t❤❡ ❡♥❞ ♦❢ t❤❡ ❧✐st✳

  86. ■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✽ Breadth-First Tree Traversal — Using Append fun nbreadth [] = [] | nbreadth (Lf :: ts) = nbreadth ts Slide 902 | nbreadth (Br(v,t,u) :: ts) = v :: nbreadth(ts @ [t,u]) Keeps an enormous queue of nodes of search Wasteful use of append 25 SECS to search depth 12 binary tree (4095 labels) ❇r❡❛❞t❤✲✜rst s❡❛r❝❤ ❝❛♥ ❜❡ ✐♥❡✣❝✐❡♥t✱ t❤✐s ♥❛✐✈❡ ✐♠♣❧❡♠❡♥t❛t✐♦♥ ❡s♣❡✲ ❝✐❛❧❧② s♦✳ ❲❤❡♥ t❤❡ s❡❛r❝❤ ✐s ❛t ❞❡♣t❤ d ♦❢ t❤❡ tr❡❡✱ t❤❡ ❧✐st ❝♦♥t❛✐♥s ❛❧❧ t❤❡ r❡♠❛✐♥✐♥❣ tr❡❡s ❛t ❞❡♣t❤ d ✱ ❢♦❧❧♦✇❡❞ ❜② t❤❡ s✉❜tr❡❡s ✭❛❧❧ ❛t ❞❡♣t❤ d + 1 ✮ ♦❢ t❤❡ tr❡❡s t❤❛t ❤❛✈❡ ❛❧r❡❛❞② ❜❡❡♥ ✈✐s✐t❡❞✳ ❆t ❞❡♣t❤ ✶✵✱ t❤❡ ❧✐st ❝♦✉❧❞ ❛❧r❡❛❞② ❝♦♥t❛✐♥ ✶✵✷✹ ❡❧❡♠❡♥ts✳ ■t r❡q✉✐r❡s ❛ ❧♦t ♦❢ s♣❛❝❡✱ ❛♥❞ ❛❣❣r❛✈❛t❡s t❤✐s ✇✐t❤ ❛ ❣r♦ss ♠✐s✉s❡ ♦❢ ❛♣♣❡♥❞✳ ❊✈❛❧✉❛t✐♥❣ ts❅❬t✱✉❪ ❝♦♣✐❡s t❤❡ ❧♦♥❣ ❧✐st ts ❥✉st t♦ ✐♥s❡rt t✇♦ ❡❧❡♠❡♥ts✳

  87. ■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✾ An Abstract Data Type: Queues • qempty is the empty queue Slide 903 • qnull tests whether a queue is empty • qhd returns the element at the head of a queue • deq discards the element at the head of a queue • enq adds an element at the end of a queue ❇r❡❛❞t❤✲✜rst s❡❛r❝❤ ❜❡❝♦♠❡s ♠✉❝❤ ❢❛st❡r ✐❢ ✇❡ r❡♣❧❛❝❡ t❤❡ ❧✐sts ❜② q✉❡✉❡s ✳ ❆ q✉❡✉❡ r❡♣r❡s❡♥ts ❛ s❡q✉❡♥❝❡✱ ❛❧❧♦✇✐♥❣ ❡❧❡♠❡♥ts t♦ ❜❡ t❛❦❡♥ ❢r♦♠ t❤❡ ❤❡❛❞ ❛♥❞ ❛❞❞❡❞ t♦ t❤❡ t❛✐❧✳ ❚❤✐s ✐s ❛ ❋✐rst✲■♥✲❋✐rst✲❖✉t ✭❋■❋❖✮ ❞✐s❝✐♣❧✐♥❡✿ t❤❡ ✐t❡♠ ♥❡①t t♦ ❜❡ r❡♠♦✈❡❞ ✐s t❤❡ ♦♥❡ t❤❛t ❤❛s ❜❡❡♥ ✐♥ t❤❡ q✉❡✉❡ ❢♦r t❤❡ ❧♦♥❣❡st t✐♠❡✳ ▲✐sts ❝❛♥ ✐♠♣❧❡♠❡♥t q✉❡✉❡s✱ ❜✉t ❛♣♣❡♥❞ ✐s ❛ ♣♦♦r ♠❡❛♥s ♦❢ ❛❞❞✐♥❣ ❡❧❡♠❡♥ts t♦ t❤❡ t❛✐❧✳ ❖✉r ❢✉♥❝t✐♦♥❛❧ ❛rr❛②s ✭▲❡❝t✳ ✽✮ ❛r❡ s✉✐t❛❜❧❡✱ ♣r♦✈✐❞❡❞ ✇❡ ❛✉❣♠❡♥t t❤❡♠ ✇✐t❤ ❛ ❢✉♥❝t✐♦♥ t♦ ❞❡❧❡t❡ t❤❡ ✜rst ❛rr❛② ❡❧❡♠❡♥t✳ ✭❙❡❡ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ♣❛❣❡ ✶✺✻✳✮ ❊❛❝❤ ♦♣❡r❛t✐♦♥ ✇♦✉❧❞ t❛❦❡ O (log n ) t✐♠❡ ❢♦r ❛ q✉❡✉❡ ♦❢ ❧❡♥❣t❤ n ✳ ❲❡ s❤❛❧❧ ❞❡s❝r✐❜❡ ❛ r❡♣r❡s❡♥t❛t✐♦♥ ♦❢ q✉❡✉❡s t❤❛t ✐s ♣✉r❡❧② ❢✉♥❝t✐♦♥❛❧✱ ❜❛s❡❞ ✉♣♦♥ ❧✐sts✱ ❛♥❞ ❡✣❝✐❡♥t✳ ❖♣❡r❛t✐♦♥s t❛❦❡ O (1) t✐♠❡ ✇❤❡♥ ❛♠♦rt✐③❡❞ ✿ ❛✈❡r❛❣❡❞ ♦✈❡r t❤❡ ❧✐❢❡t✐♠❡ ♦❢ ❛ q✉❡✉❡✳ ❆ ❝♦♥✈❡♥t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ t❡❝❤♥✐q✉❡ ✐s t♦ r❡♣r❡s❡♥t ❛ q✉❡✉❡ ❜② ❛♥ ❛rr❛②✳ ❚✇♦ ✐♥❞✐❝❡s ♣♦✐♥t t♦ t❤❡ ❢r♦♥t ❛♥❞ ❜❛❝❦ ♦❢ t❤❡ q✉❡✉❡✱ ✇❤✐❝❤ ♠❛② ✇r❛♣ ❛r♦✉♥❞ t❤❡ ❡♥❞ ♦❢ t❤❡ ❛rr❛②✳ ❚❤❡ ❝♦❞✐♥❣ ✐s s♦♠❡✇❤❛t tr✐❝❦②✳ ❲♦rs❡✱ t❤❡ ❧❡♥❣t❤ ♦❢ t❤❡ q✉❡✉❡ ♠✉st ❜❡ ❣✐✈❡♥ ❛ ✜①❡❞ ✉♣♣❡r ❜♦✉♥❞✳

  88. ■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✵ Efficient Functional Queues: Idea Represent the queue x 1 x 2 . . . x m y n . . . y 1 by any pair of lists Slide 904 ([ x 1 , x 2 , . . . , x m ] , [ y 1 , y 2 , . . . , y n ]) Add new items to rear list Remove items from front list ; if empty move rear to front Amortized time per operation is O (1) ◗✉❡✉❡s r❡q✉✐r❡ ❡✣❝✐❡♥t ❛❝❝❡ss ❛t ❜♦t❤ ❡♥❞s✿ ❛t t❤❡ ❢r♦♥t✱ ❢♦r r❡♠♦✈❛❧✱ ❛♥❞ ❛t t❤❡ ❜❛❝❦✱ ❢♦r ✐♥s❡rt✐♦♥✳ ■❞❡❛❧❧②✱ ❛❝❝❡ss s❤♦✉❧❞ t❛❦❡ ❝♦♥st❛♥t t✐♠❡✱ O (1) ✳ ■t ♠❛② ❛♣♣❡❛r t❤❛t ❧✐sts ❝❛♥♥♦t ♣r♦✈✐❞❡ s✉❝❤ ❛❝❝❡ss✳ ■❢ ❡♥q✭q✱①✮ ♣❡r❢♦r♠s q❅❬①❪ ✱ t❤❡♥ t❤✐s ♦♣❡r❛t✐♦♥ ✇✐❧❧ ❜❡ O ( n ) ✳ ❲❡ ❝♦✉❧❞ r❡♣r❡s❡♥t q✉❡✉❡s ❜② r❡✈❡rs❡❞ ❧✐sts✱ ✐♠♣❧❡♠❡♥t✐♥❣ ❡♥q✭q✱①✮ ❜② ①✿✿q ✱ ❜✉t t❤❡♥ t❤❡ ❞❡q ❛♥❞ q❤❞ ♦♣❡r❛t✐♦♥s ✇♦✉❧❞ ❜❡ O ( n ) ✳ ▲✐♥❡❛r t✐♠❡ ✐s ✐♥t♦❧❡r❛❜❧❡✿ ❛ s❡r✐❡s ♦❢ n q✉❡✉❡ ♦♣❡r❛t✐♦♥s ❝♦✉❧❞ t❤❡♥ r❡q✉✐r❡ O ( n 2 ) t✐♠❡✳ ❚❤❡ s♦❧✉t✐♦♥ ✐s t♦ r❡♣r❡s❡♥t ❛ q✉❡✉❡ ❜② ❛ ♣❛✐r ♦❢ ❧✐sts✱ ✇❤❡r❡ ([ x 1 , x 2 , . . . , x m ] , [ y 1 , y 2 , . . . , y n ]) r❡♣r❡s❡♥ts t❤❡ q✉❡✉❡ x 1 x 2 . . . x m y n . . . y 1 ✳ ❚❤❡ ❢r♦♥t ♣❛rt ♦❢ t❤❡ q✉❡✉❡ ✐s st♦r❡❞ ✐♥ ♦r❞❡r✱ ❛♥❞ t❤❡ r❡❛r ♣❛rt ✐s st♦r❡❞ ✐♥ r❡✈❡rs❡ ♦r❞❡r✳ ❚❤❡ ❡♥q ♦♣❡r❛t✐♦♥ ❛❞❞s ❡❧❡♠❡♥ts t♦ t❤❡ r❡❛r ♣❛rt ✉s✐♥❣ ❝♦♥s✱ s✐♥❝❡ t❤✐s ❧✐st ✐s r❡✈❡rs❡❞❀ t❤✉s✱ ❡♥q t❛❦❡s ❝♦♥st❛♥t t✐♠❡✳ ❚❤❡ ❞❡q ❛♥❞ q❤❞ ♦♣❡r❛t✐♦♥s ❧♦♦❦ ❛t t❤❡ ❢r♦♥t ♣❛rt✱ ✇❤✐❝❤ ♥♦r♠❛❧❧② t❛❦❡s ❝♦♥st❛♥t t✐♠❡✱ s✐♥❝❡ t❤✐s ❧✐st ✐s st♦r❡❞ ✐♥ ♦r❞❡r✳ ❇✉t s♦♠❡t✐♠❡s ❞❡q r❡♠♦✈❡s t❤❡ ❧❛st ❡❧❡♠❡♥t ❢r♦♠ t❤❡ ❢r♦♥t ♣❛rt❀ ✇❤❡♥ t❤✐s ❤❛♣♣❡♥s✱ ✐t r❡✈❡rs❡s t❤❡ r❡❛r ♣❛rt✱ ✇❤✐❝❤ ❜❡❝♦♠❡s t❤❡ ♥❡✇ ❢r♦♥t ♣❛rt✳ ❆♠♦rt✐③❡❞ t✐♠❡ r❡❢❡rs t♦ t❤❡ ❝♦st ♣❡r ♦♣❡r❛t✐♦♥ ❛✈❡r❛❣❡❞ ♦✈❡r t❤❡ ❧✐❢❡t✐♠❡ ♦❢ ❛♥② ❝♦♠♣❧❡t❡ ❡①❡❝✉t✐♦♥✳ ❊✈❡♥ ❢♦r t❤❡ ✇♦rst ♣♦ss✐❜❧❡ ❡①❡❝✉t✐♦♥✱ t❤❡ ❛✈❡r❛❣❡ ❝♦st ♣❡r ♦♣❡r❛t✐♦♥ t✉r♥s ♦✉t t♦ ❜❡ ❝♦♥st❛♥t❀ s❡❡ t❤❡ ❛♥❛❧②s✐s ❜❡❧♦✇✳

  89. ■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✶ Efficient Functional Queues: Code datatype ’a queue = Q of ’a list * ’a list fun norm(Q([],tls)) = Q(rev tls, []) Slide 905 | norm q = q fun qnull(Q([],[])) = true | qnull _ = false fun enq(Q(hds,tls), x) = norm(Q(hds, x::tls)) fun deq(Q(x::hds, tls)) = norm(Q(hds, tls)) ❚❤❡ ❞❛t❛t②♣❡ ♦❢ q✉❡✉❡s ♣r❡✈❡♥ts ❝♦♥❢✉s✐♦♥ ✇✐t❤ ♦t❤❡r ♣❛✐rs ♦❢ ❧✐sts✳ ❚❤❡ ❡♠♣t② q✉❡✉❡✱ ♦♠✐tt❡❞ t♦ s❛✈❡ s♣❛❝❡ ♦♥ t❤❡ s❧✐❞❡✱ ❤❛s ❜♦t❤ ♣❛rts ❡♠♣t②✳ ✈❛❧ q❡♠♣t② ❂ ◗✭❬❪✱❬❪✮❀ ❚❤❡ ❢✉♥❝t✐♦♥ ♥♦r♠ ♣✉ts ❛ q✉❡✉❡ ✐♥t♦ ♥♦r♠❛❧ ❢♦r♠✱ ❡♥s✉r✐♥❣ t❤❛t t❤❡ ❢r♦♥t ♣❛rt ✐s ♥❡✈❡r ❡♠♣t② ✉♥❧❡ss t❤❡ ❡♥t✐r❡ q✉❡✉❡ ✐s ❡♠♣t②✳ ❋✉♥❝t✐♦♥s ❞❡q ❛♥❞ ❡♥q ❝❛❧❧ ♥♦r♠ t♦ ♥♦r♠❛❧✐③❡ t❤❡✐r r❡s✉❧t✳ ❇❡❝❛✉s❡ q✉❡✉❡s ❛r❡ ✐♥ ♥♦r♠❛❧ ❢♦r♠✱ t❤❡✐r ❤❡❛❞ ✐s ❝❡rt❛✐♥ t♦ ❜❡ ✐♥ t❤❡✐r ❢r♦♥t ♣❛rt✱ s♦ q❤❞ ✭❛❧s♦ ♦♠✐tt❡❞ ❢r♦♠ t❤❡ s❧✐❞❡✮ ❧♦♦❦s t❤❡r❡✳ ❢✉♥ q❤❞✭◗✭①✿✿❴✱❴✮✮ ❂ ① ▲❡t ✉s ❛♥❛❧②s❡ t❤❡ ❝♦st ♦❢ ❛♥ ❡①❡❝✉t✐♦♥ ❝♦♠♣r✐s✐♥❣ ✭✐♥ ❛♥② ♣♦ss✐❜❧❡ ♦r❞❡r✮ n ❡♥q ♦♣❡r❛t✐♦♥s ❛♥❞ n ❞❡q ♦♣❡r❛t✐♦♥s✱ st❛rt✐♥❣ ✇✐t❤ ❛♥ ❡♠♣t② q✉❡✉❡✳ ❊❛❝❤ ❡♥q ♦♣❡r❛t✐♦♥ ✇✐❧❧ ♣❡r❢♦r♠ ♦♥❡ ❝♦♥s✱ ❛❞❞✐♥❣ ❛♥ ❡❧❡♠❡♥t t♦ t❤❡ r❡❛r ♣❛rt✳ ❙✐♥❝❡ t❤❡ ✜♥❛❧ q✉❡✉❡ ♠✉st ❜❡ ❡♠♣t②✱ ❡❛❝❤ ❡❧❡♠❡♥t ♦❢ t❤❡ r❡❛r ♣❛rt ❣❡ts tr❛♥s❢❡rr❡❞ t♦ t❤❡ ❢r♦♥t ♣❛rt✳ ❚❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ r❡✈❡rs❛❧s ♣❡r❢♦r♠ ♦♥❡ ❝♦♥s ♣❡r ❡❧❡♠❡♥t✳ ❚❤✉s✱ t❤❡ t♦t❛❧ ❝♦st ♦❢ t❤❡ s❡r✐❡s ♦❢ q✉❡✉❡ ♦♣❡r❛t✐♦♥s ✐s 2 n ❝♦♥s ♦♣❡r❛t✐♦♥s✱ ❛♥ ❛✈❡r❛❣❡ ♦❢ ✷ ♣❡r ♦♣❡r❛t✐♦♥✳ ❚❤❡ ❛♠♦rt✐③❡❞ t✐♠❡ ✐s O (1) ✳ ❚❤❡r❡ ✐s ❛ ❝❛t❝❤✳ ❚❤❡ ❝♦♥s❡s ♥❡❡❞ ♥♦t ❜❡ ❞✐str✐❜✉t❡❞ ❡✈❡♥❧②❀ r❡✈❡rs✐♥❣ ❛ ❧♦♥❣ ❧✐st ❝♦✉❧❞ t❛❦❡ ✉♣ t♦ n − 1 ♦❢ t❤❡♠✳ ❯♥♣r❡❞✐❝t❛❜❧❡ ❞❡❧❛②s ♠❛❦❡ t❤❡ ❛♣♣r♦❛❝❤ ✉♥s✉✐t❛❜❧❡ ❢♦r r❡❛❧✲t✐♠❡ ♣r♦❣r❛♠♠✐♥❣ ✱ ✇❤❡r❡ ❞❡❛❞❧✐♥❡s ♠✉st ❜❡ ♠❡t✳

  90. ■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✷ Aside: The case Expression fun wheels v = Slide 906 case v of Bike => 2 | Motorbike _ => 2 | Car robin => if robin then 3 else 4 | Lorry w => w; ❚❤❡ ❝❛s❡ ❡①♣r❡ss✐♦♥ ❤❛s t❤❡ ❢♦r♠ ❝❛s❡ E ♦❢ P 1 ❂❃ E 1 ⑤ · · · ⑤ P n ❂❃ E n ■t tr✐❡s t❤❡ ♣❛tt❡r♥s ♦♥❡ ❛❢t❡r t❤❡ ♦t❤❡r✳ ❲❤❡♥ ♦♥❡ ♠❛t❝❤❡s✱ ✐t ❡✈❛❧✉❛t❡s t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ ❡①♣r❡ss✐♦♥✳ ■t ❜❡❤❛✈❡s ♣r❡❝✐s❡❧② ❧✐❦❡ t❤❡ ❜♦❞② ♦❢ ❛ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥✳ ❲❡ ❝♦✉❧❞ ❤❛✈❡ ❞❡✜♥❡❞ ❢✉♥❝t✐♦♥ ✇❤❡❡❧s ✭❢r♦♠ ▲❡❝t✳ ✼✮ ❛s s❤♦✇♥ ❛❜♦✈❡✳ ❆ ♣r♦❣r❛♠ ♣❤r❛s❡ ♦❢ t❤❡ ❢♦r♠ P 1 ❂❃ E 1 ⑤ · · · ⑤ P n ❂❃ E n ✐s ❝❛❧❧❡❞ ❛ ▼❛t❝❤ ✳ ❆ ♠❛t❝❤ ♠❛② ❛❧s♦ ❛♣♣❡❛r ❛❢t❡r ❛♥ ❡①❝❡♣t✐♦♥ ❤❛♥❞❧❡r ✭▲❡❝t✳ ✼✮ ❛♥❞ ✇✐t❤ ❢♥ ✲♥♦t❛t✐♦♥ t♦ ❡①♣r❡ss✐♦♥ ❢✉♥❝t✐♦♥s ❞✐r❡❝t❧② ✭▲❡❝t✳ ✶✵✮✳

  91. ■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✸ Breadth-First Tree Traversal — Using Queues fun breadth q = if qnull q then [] else case qhd q of Slide 907 Lf => breadth (deq q) | Br(v,t,u) => v :: breadth(enq(enq(deq q, t), u)) 0.14 secs to search depth 12 binary tree (4095 labels) 200 times faster! ❚❤✐s ❢✉♥❝t✐♦♥ ✐♠♣❧❡♠❡♥ts t❤❡ s❛♠❡ ❛❧❣♦r✐t❤♠ ❛s ♥❜r❡❛❞t❤ ❜✉t ✉s❡s ❛ ❞✐✛❡r❡♥t ❞❛t❛ str✉❝t✉r❡✳ ■t r❡♣r❡s❡♥ts q✉❡✉❡s ✉s✐♥❣ t②♣❡ q✉❡✉❡ ✐♥st❡❛❞ ♦❢ t②♣❡ ❧✐st ✳ ❚♦ ❝♦♠♣❛r❡ t❤❡✐r ❡✣❝✐❡♥❝②✱ ■ ❛♣♣❧✐❡❞ ❜♦t❤ ❢✉♥❝t✐♦♥s t♦ t❤❡ ❢✉❧❧ ❜✐♥❛r② tr❡❡ ♦❢ ❞❡♣t❤ ✶✷✱ ✇❤✐❝❤ ❝♦♥t❛✐♥s ✹✵✾✺ ❧❛❜❡❧s✳ ❚❤❡ ❢✉♥❝t✐♦♥ ♥❜r❡❛❞t❤ t♦♦❦ ✸✵ s❡❝♦♥❞s ✇❤✐❧❡ ❜r❡❛❞t❤ t♦♦❦ ♦♥❧② ✵✳✶✺ s❡❝♦♥❞s✿ ❢❛st❡r ❜② ❛ ❢❛❝t♦r ♦❢ ✷✵✵✳ ❋♦r ❧❛r❣❡r tr❡❡s✱ t❤❡ s♣❡❡❞✉♣ ✇♦✉❧❞ ❜❡ ❣r❡❛t❡r✳ ❈❤♦♦s✐♥❣ t❤❡ r✐❣❤t ❞❛t❛ str✉❝t✉r❡ ♣❛②s ❤❛♥❞s♦♠❡❧②✳

  92. ■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✹ Iterative deepening: Another Exhaustive Search Breadth-first search examines O ( b d ) nodes: 1 + b + · · · + b d = b d +1 − 1 b = branching factor Slide 908 b − 1 d = depth Recompute nodes at depth d instead of storing them Time factor is b/ ( b − 1) if b > 1 ; complexity is still O ( b d ) Space required at depth d drops from b d to d ❇r❡❛❞t❤✲✜rst s❡❛r❝❤ ✐s ♥♦t ♣r❛❝t✐❝❛❧ ❢♦r ❜✐❣ ♣r♦❜❧❡♠s✿ ✐t ✉s❡s t♦♦ ♠✉❝❤ s♣❛❝❡✳ ❈♦♥s✐❞❡r t❤❡ s❧✐❣❤t❧② ♠♦r❡ ❣❡♥❡r❛❧ ♣r♦❜❧❡♠ ♦❢ s❡❛r❝❤✐♥❣ tr❡❡s ✇❤♦s❡ ❜r❛♥❝❤✐♥❣ ❢❛❝t♦r ✐s b ✭❢♦r ❜✐♥❛r② tr❡❡s✱ b = 2 ✮✳ ❚❤❡♥ ❜r❡❛❞t❤✲✜rst s❡❛r❝❤ t♦ ❞❡♣t❤ d ❡①❛♠✐♥❡s ( b d +1 − 1) / ( b − 1) ♥♦❞❡s✱ ✇❤✐❝❤ ✐s O ( b d ) ✱ ✐❣♥♦r✐♥❣ t❤❡ ❝♦♥st❛♥t ❢❛❝t♦r ♦❢ b/ ( b − 1) ✳✮ ❙✐♥❝❡ ❛❧❧ ♥♦❞❡s t❤❛t ❛r❡ ❡①❛♠✐♥❡❞ ❛r❡ ❛❧s♦ st♦r❡❞✱ t❤❡ s♣❛❝❡ ❛♥❞ t✐♠❡ r❡q✉✐r❡♠❡♥ts ❛r❡ ❜♦t❤ O ( b d ) ✳ ❉❡♣t❤✲✜rst ✐t❡r❛t✐✈❡ ❞❡❡♣❡♥✐♥❣ ❝♦♠❜✐♥❡s t❤❡ s♣❛❝❡ ❡✣❝✐❡♥❝② ♦❢ ❞❡♣t❤✲✜rst ✇✐t❤ t❤❡ ❵♥❡❛r❡st✲✜rst✬ ♣r♦♣❡rt② ♦❢ ❜r❡❛❞t❤✲✜rst s❡❛r❝❤✳ ■t ♣❡r❢♦r♠s r❡♣❡❛t❡❞ ❞❡♣t❤✲✜rst s❡❛r❝❤❡s ✇✐t❤ ✐♥❝r❡❛s✐♥❣ ❞❡♣t❤ ❜♦✉♥❞s✱ ❡❛❝❤ t✐♠❡ ❞✐s❝❛r❞✐♥❣ t❤❡ r❡s✉❧t ♦❢ t❤❡ ♣r❡✈✐♦✉s s❡❛r❝❤✳ ❚❤✉s ✐t s❡❛r❝❤❡s t♦ ❞❡♣t❤ ✶✱ t❤❡♥ t♦ ❞❡♣t❤ ✷✱ ❛♥❞ s♦ ♦♥ ✉♥t✐❧ ✐t ✜♥❞s ❛ s♦❧✉t✐♦♥✳ ❲❡ ❝❛♥ ❛✛♦r❞ t♦ ❞✐s❝❛r❞ ♣r❡✈✐♦✉s r❡s✉❧ts ❜❡❝❛✉s❡ t❤❡ ♥✉♠❜❡r ♦❢ ♥♦❞❡s ✐s ❣r♦✇✐♥❣ ❡①♣♦♥❡♥t✐❛❧❧②✳ ❚❤❡r❡ ❛r❡ b d +1 ♥♦❞❡s ❛t ❧❡✈❡❧ d + 1 ❀ ✐❢ b ≥ 2 ✱ t❤✐s ♥✉♠❜❡r ❛❝t✉❛❧❧② ❡①❝❡❡❞s t❤❡ t♦t❛❧ ♥✉♠❜❡r ♦❢ ♥♦❞❡s ♦❢ ❛❧❧ ♣r❡✈✐♦✉s ❧❡✈❡❧s ♣✉t t♦❣❡t❤❡r✱ ♥❛♠❡❧② ( b d +1 − 1) / ( b − 1) ✳ ❑♦r❢ ❬✶✶❪ s❤♦✇s t❤❛t t❤❡ t✐♠❡ ♥❡❡❞❡❞ ❢♦r ✐t❡r❛t✐✈❡ ❞❡❡♣❡♥✐♥❣ t♦ r❡❛❝❤ ❞❡♣t❤ d ✐s ♦♥❧② b/ ( b − 1) t✐♠❡s t❤❛t ❢♦r ❜r❡❛❞t❤✲✜rst s❡❛r❝❤✱ ✐❢ b > 1 ✳ ❚❤✐s ✐s ❛ ❝♦♥st❛♥t ❢❛❝t♦r❀ ❜♦t❤ ❛❧❣♦r✐t❤♠s ❤❛✈❡ t❤❡ s❛♠❡ t✐♠❡ ❝♦♠♣❧❡①✐t②✱ O ( b d ) ✳ ■♥ t②♣✐❝❛❧ ❛♣♣❧✐❝❛t✐♦♥s ✇❤❡r❡ b ≥ 2 t❤❡ ❡①tr❛ ❢❛❝t♦r ♦❢ b/ ( b − 1) ✐s q✉✐t❡ t♦❧❡r❛❜❧❡✳ ❚❤❡ r❡❞✉❝t✐♦♥ ✐♥ t❤❡ s♣❛❝❡ r❡q✉✐r❡♠❡♥t ✐s ❡①♣♦♥❡♥t✐❛❧✱ ❢r♦♠ O ( b d ) ❢♦r ❜r❡❛❞t❤✲✜rst t♦ O ( d ) ❢♦r ✐t❡r❛t✐✈❡ ❞❡❡♣❡♥✐♥❣✳

  93. ■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✺ Another Abstract Data Type: Stacks • empty is the empty stack Slide 909 • null tests whether a stack is empty • top returns the element at the top of a stack • pop discards the element at the top of a stack • push adds an element at the top of a stack ❆ st❛❝❦ ✐s ❛ s❡q✉❡♥❝❡ s✉❝❤ t❤❛t ✐t❡♠s ❝❛♥ ❜❡ ❛❞❞❡❞ ♦r r❡♠♦✈❡❞ ❢r♦♠ t❤❡ ❤❡❛❞ ♦♥❧②✳ ❆ st❛❝❦ ♦❜❡②s ❛ ▲❛st✲■♥✲❋✐rst✲❖✉t ✭▲■❋❖✮ ❞✐s❝✐♣❧✐♥❡✿ t❤❡ ✐t❡♠ ♥❡①t t♦ ❜❡ r❡♠♦✈❡❞ ✐s t❤❡ ♦♥❡ t❤❛t ❤❛s ❜❡❡♥ ✐♥ t❤❡ q✉❡✉❡ ❢♦r t❤❡ s❤♦rt❡st t✐♠❡✳ ▲✐sts ❝❛♥ ❡❛s✐❧② ✐♠♣❧❡♠❡♥t st❛❝❦s ❜❡❝❛✉s❡ ❜♦t❤ ❝♦♥s ❛♥❞ ❤❞ ❛✛❡❝t t❤❡ ❤❡❛❞✳ ❇✉t ✉♥❧✐❦❡ ❧✐sts✱ st❛❝❦s ❛r❡ ♦❢t❡♥ r❡❣❛r❞❡❞ ❛s ❛♥ ✐♠♣❡r❛t✐✈❡ ❞❛t❛ str✉❝t✉r❡✿ t❤❡ ❡✛❡❝t ♦❢ ♣✉s❤ ♦r ♣♦♣ ✐s t♦ ❝❤❛♥❣❡ ❛♥ ❡①✐st✐♥❣ st❛❝❦✱ ♥♦t r❡t✉r♥ ❛ ♥❡✇ ♦♥❡✳ ■♥ ❝♦♥✈❡♥t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✱ ❛ st❛❝❦ ✐s ♦❢t❡♥ ✐♠♣❧❡♠❡♥t❡❞ ❜② st♦r✐♥❣ t❤❡ ❡❧❡♠❡♥ts ✐♥ ❛♥ ❛rr❛②✱ ✉s✐♥❣ ❛ ✈❛r✐❛❜❧❡ ✭t❤❡ st❛❝❦ ♣♦✐♥t❡r ✮ t♦ ❝♦✉♥t t❤❡♠✳ ▼♦st ❧❛♥❣✉❛❣❡ ♣r♦❝❡ss♦rs ❦❡❡♣ tr❛❝❦ ♦❢ r❡❝✉rs✐✈❡ ❢✉♥❝t✐♦♥ ❝❛❧❧s ✉s✐♥❣ ❛♥ ✐♥t❡r♥❛❧ st❛❝❦✳

  94. ■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✻ A Survey of Search Methods 1. Depth-first : use a stack (efficient but incomplete) 2. Breadth-first : use a queue (uses too much space!) Slide 910 3. Iterative deepening : use (1) to get benefits of (2) (trades time for space) 4. Best-first : use a priority queue (heuristic search) The data structure determines the search! ❙❡❛r❝❤ ♣r♦❝❡❞✉r❡s ❝❛♥ ❜❡ ❝❧❛ss✐✜❡❞ ❜② t❤❡ ❞❛t❛ str✉❝t✉r❡ ✉s❡❞ t♦ st♦r❡ ♣❡♥❞✐♥❣ s✉❜tr❡❡s✳ ❉❡♣t❤✲✜rst s❡❛r❝❤ st♦r❡s t❤❡♠ ♦♥ ❛ st❛❝❦✱ ✇❤✐❝❤ ✐s ✐♠♣❧✐❝✐t ✐♥ ❢✉♥❝t✐♦♥s ❧✐❦❡ ✐♥♦r❞❡r ✱ ❜✉t ❝❛♥ ❜❡ ♠❛❞❡ ❡①♣❧✐❝✐t✳ ❇r❡❛❞t❤✲✜rst s❡❛r❝❤ st♦r❡s s✉❝❤ ♥♦❞❡s ✐♥ ❛ q✉❡✉❡✳ ❆♥ ✐♠♣♦rt❛♥t ✈❛r✐❛t✐♦♥ ✐s t♦ st♦r❡ t❤❡ ♥♦❞❡s ✐♥ ❛ ♣r✐♦r✐t② q✉❡✉❡ ✱ ✇❤✐❝❤ ✐s ❛♥ ♦r❞❡r❡❞ s❡q✉❡♥❝❡✳ ❚❤❡ ♣r✐♦r✐t② q✉❡✉❡ ❛♣♣❧✐❡s s♦♠❡ s♦rt ♦❢ r❛♥❦✐♥❣ ❢✉♥❝t✐♦♥ t♦ t❤❡ ♥♦❞❡s✱ ♣❧❛❝✐♥❣ ❤✐❣❤❡r✲r❛♥❦❡❞ ♥♦❞❡s ❜❡❢♦r❡ ❧♦✇❡r✲r❛♥❦❡❞ ♦♥❡s✳ ❚❤❡ r❛♥❦✐♥❣ ❢✉♥❝t✐♦♥ t②♣✐❝❛❧❧② ❡st✐♠❛t❡s t❤❡ ❞✐st❛♥❝❡ ❢r♦♠ t❤❡ ♥♦❞❡ t♦ ❛ s♦❧✉t✐♦♥✳ ■❢ t❤❡ ❡st✐♠❛t❡ ✐s ❣♦♦❞✱ t❤❡ s♦❧✉t✐♦♥ ✐s ❧♦❝❛t❡❞ s✇✐❢t❧②✳ ❚❤✐s ♠❡t❤♦❞ ✐s ❝❛❧❧❡❞ ❜❡st✲✜rst s❡❛r❝❤ ✳ ❚❤❡ ♣r✐♦r✐t② q✉❡✉❡ ❝❛♥ ❜❡ ❦❡♣t ❛s ❛ s♦rt❡❞ ❧✐st✱ ❛❧t❤♦✉❣❤ t❤✐s ✐s s❧♦✇✳ ❇✐♥❛r② s❡❛r❝❤ tr❡❡s ✇♦✉❧❞ ❜❡ ♠✉❝❤ ❜❡tt❡r ♦♥ ❛✈❡r❛❣❡✱ ❛♥❞ ❢❛♥❝✐❡r ❞❛t❛ str✉❝✲ t✉r❡s ✐♠♣r♦✈❡ ♠❛tt❡rs ❢✉rt❤❡r✳ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✷✺✽✕✷✻✸✳ ❋♦r ♣r✐♦r✐t② q✉❡✉❡s✱ s❡❡ ✶✺✾✕✶✻✹✳

  95. ❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✼ Functions as Values In ML, functions can be • passed as arguments to other functions, Slide 1001 • returned as results , • put into lists, trees, etc., • but not tested for equality. Functions represent algorithms and infinite data structures . Pr♦❣r❡ss ✐♥ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❝❛♥ ❜❡ ♠❡❛s✉r❡❞ ❜② ✇❤❛t ❛❜str❛❝✲ t✐♦♥s t❤❡② ❛❞♠✐t✳ ❈♦♥❞✐t✐♦♥❛❧ ❡①♣r❡ss✐♦♥s ✭❞❡s❝❡♥❞❡❞ ❢r♦♠ ❝♦♥❞✐t✐♦♥❛❧ ❥✉♠♣s ❜❛s❡❞ ♦♥ t❤❡ s✐❣♥ ♦❢ s♦♠❡ ♥✉♠❡r✐❝ ✈❛r✐❛❜❧❡✮ ❛♥❞ ♣❛r❛♠❡tr✐❝ t②♣❡s s✉❝❤ ❛s α ❧✐st ❛r❡ ❡①❛♠♣❧❡s✳ ❚❤❡ ✐❞❡❛ t❤❛t ❢✉♥❝t✐♦♥s ❝♦✉❧❞ ❜❡ ✉s❡❞ ❛s ✈❛❧✉❡s ✐♥ ❛ ❝♦♠♣✉t❛t✐♦♥ ❛r♦s❡ ❡❛r❧②✱ ❜✉t ✐t t♦♦❦ s♦♠❡ t✐♠❡ ❜❡❢♦r❡ t❤❡ ✐❞❡❛ ✇❛s ❢✉❧❧② r❡❛❧✐③❡❞✳ ▼❛♥② ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❧❡t ❢✉♥❝t✐♦♥s ❜❡ ♣❛ss❡❞ ❛s ❛r❣✉♠❡♥ts t♦ ♦t❤❡r ❢✉♥❝t✐♦♥s✱ ❜✉t ❢❡✇ t❛❦❡ t❤❡ tr♦✉❜❧❡ ♥❡❡❞❡❞ t♦ ❛❧❧♦✇ ❢✉♥❝t✐♦♥s t♦ ❜❡ r❡t✉r♥❡❞ ❛s r❡s✉❧ts✳ ■♥ ♠❛t❤❡♠❛t✐❝s✱ ❛ ❢✉♥❝t✐♦♥❛❧ ♦r ❤✐❣❤❡r✲♦r❞❡r ❢✉♥❝t✐♦♥ ✐s ❛ ❢✉♥❝t✐♦♥ t❤❛t tr❛♥s❢♦r♠s ♦t❤❡r ❢✉♥❝t✐♦♥s✳ ▼❛♥② ❢✉♥❝t✐♦♥❛❧s ❛r❡ ❢❛♠✐❧✐❛r ❢r♦♠ ♠❛t❤❡♠❛t✐❝s✱ s✉❝❤ ❛s ✐♥t❡❣r❛❧ ❛♥❞ ❞✐✛❡r❡♥t✐❛❧ ♦♣❡r❛t♦rs ♦❢ t❤❡ ❝❛❧❝✉❧✉s✳ ❚♦ ❛ ♠❛t❤❡♠❛t✐✲ ❝✐❛♥✱ ❛ ❢✉♥❝t✐♦♥ ✐s t②♣✐❝❛❧❧② ❛♥ ✐♥✜♥✐t❡✱ ✉♥❝♦♠♣✉t❛❜❧❡ ♦❜❥❡❝t✳ ❲❡ ✉s❡ ▼▲ ❢✉♥❝t✐♦♥s t♦ r❡♣r❡s❡♥t ❛❧❣♦r✐t❤♠s✳ ❙♦♠❡t✐♠❡s t❤❡② r❡♣r❡s❡♥t ✐♥✜♥✐t❡ ❝♦❧❧❡❝✲ t✐♦♥s ♦❢ ❞❛t❛ ❣✐✈❡♥ ❜② ❝♦♠♣✉t❛t✐♦♥ r✉❧❡s✳ ❋✉♥❝t✐♦♥s ❝❛♥♥♦t ❜❡ ❝♦♠♣❛r❡❞ ❢♦r ❡q✉❛❧✐t②✳ ❚❤❡ ❜❡st ✇❡ ❝♦✉❧❞ ❞♦✱ ✇✐t❤ r❡❛s♦♥❛❜❧❡ ❡✣❝✐❡♥❝②✱ ✇♦✉❧❞ ❜❡ t♦ t❡st ✐❞❡♥t✐t② ♦❢ ♠❛❝❤✐♥❡ ❛❞❞r❡ss❡s✳ ❚✇♦ s❡♣❛r❛t❡ ♦❝❝✉rr❡♥❝❡s ♦❢ t❤❡ s❛♠❡ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ ✇♦✉❧❞ ❜❡ r❡❣❛r❞❡❞ ❛s ✉♥❡q✉❛❧ ❜❡❝❛✉s❡ t❤❡② ✇♦✉❧❞ ❜❡ ❝♦♠♣✐❧❡❞ t♦ ❞✐✛❡r❡♥t ♠❛❝❤✐♥❡ ❛❞❞r❡ss❡s✳ ❙✉❝❤ ❛ ❧♦✇✲❧❡✈❡❧ ❢❡❛t✉r❡ ❤❛s ♥♦ ♣❧❛❝❡ ✐♥ ❛ ❧❛♥❣✉❛❣❡ ❧✐❦❡ ▼▲✳

  96. ❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✽ Functions Without Names fn x => E is the function f such that f ( x ) = E The function (fn n => n*2) is a doubling function . Slide 1002 (fn n => n*2); > val it = fn : int -> int (fn n => n*2) 17; > val it = 34 : int ■❢ ❢✉♥❝t✐♦♥s ❛r❡ t♦ ❜❡ r❡❣❛r❞❡❞ ❛s ❝♦♠♣✉t❛t✐♦♥❛❧ ✈❛❧✉❡s✱ t❤❡♥ ✇❡ ♥❡❡❞ ❛ ♥♦t❛t✐♦♥ ❢♦r t❤❡♠✳ ❚❤❡ ❢♥ ✲♥♦t❛t✐♦♥ ❡①♣r❡ss❡s ❛ ❢✉♥❝t✐♦♥ ✈❛❧✉❡ ✇✐t❤♦✉t ❣✐✈✐♥❣ t❤❡ ❢✉♥❝t✐♦♥ ❛ ♥❛♠❡✳ ✭❙♦♠❡ ♣❡♦♣❧❡ ♣r♦♥♦✉♥❝❡ ❢♥ ❛s ❵❧❛♠❜❞❛✬ ❜❡❝❛✉s❡ ✐t ♦r✐❣✐♥❛t❡❞ ✐♥ t❤❡ λ ✲❝❛❧❝✉❧✉s✳✮ ■t ❝❛♥♥♦t ❡①♣r❡ss r❡❝✉rs✐♦♥✳ ■ts ♠❛✐♥ ♣✉r♣♦s❡ ✐s t♦ ♣❛❝❦❛❣❡ ✉♣ s♠❛❧❧ ❡①♣r❡ss✐♦♥s t❤❛t ❛r❡ t♦ ❜❡ ❛♣♣❧✐❡❞ r❡♣❡❛t❡❞❧② ✉s✐♥❣ s♦♠❡ ♦t❤❡r ❢✉♥❝t✐♦♥✳ ❚❤❡ ❡①♣r❡ss✐♦♥ ✭❢♥ ♥ ❂❃ ♥✯✷✮ ❤❛s t❤❡ s❛♠❡ ✈❛❧✉❡ ❛s t❤❡ ✐❞❡♥t✐✜❡r ❞♦✉❜❧❡ ✱ ❞❡❝❧❛r❡❞ ❛s ❢♦❧❧♦✇s✿ ❢✉♥ ❞♦✉❜❧❡ ♥ ❂ ♥✯✷ ❚❤❡ ❢♥ ✲♥♦t❛t✐♦♥ ❛❧❧♦✇s ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✱ ❧✐❦❡ ❝❛s❡ ❡①♣r❡ss✐♦♥s ❛♥❞ ❡①✲ ❝❡♣t✐♦♥ ❤❛♥❞❧❡rs✱ t♦ ❡①♣r❡ss ❢✉♥❝t✐♦♥s ✇✐t❤ ♠✉❧t✐♣❧❡ ❝❧❛✉s❡s✿ ❢♥ P 1 ❂❃ E 1 ⑤ ✳✳✳ ⑤ P n ❂❃ E n ❚❤✐s r❛r❡❧②✲✉s❡❞ ❡①♣r❡ss✐♦♥ ❛❜❜r❡✈✐❛t❡s t❤❡ ❧♦❝❛❧ ❞❡❝❧❛r❛t✐♦♥ ❧❡t ❢✉♥ f ( P 1 ) ❂ E 1 ⑤ ✳✳✳ ⑤ f ( P n ) ❂ E n ✐♥ f ❡♥❞ ❋♦r ❡①❛♠♣❧❡✱ t❤❡ ❢♦❧❧♦✇✐♥❣ ❞❡❝❧❛r❛t✐♦♥s ❛r❡ ❡q✉✐✈❛❧❡♥t✿ ✈❛❧ ♥♦t ❂ ✭❢♥ ❢❛❧s❡ ❂❃ tr✉❡ ⑤ tr✉❡ ❂❃ ❢❛❧s❡✮ ❢✉♥ ♥♦t ❢❛❧s❡ ❂ tr✉❡ ⑤ ♥♦t tr✉❡ ❂ ❢❛❧s❡

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend