Download presentation
Presentation is loading. Please wait.
Published byDarren Ferguson Modified over 9 years ago
1
מבוא מורחב 1 Multiple representations of data
2
מבוא מורחב 2 Complex numbers imaginary real 3 2 3 + 2i 13 atan(2/3)
3
מבוא מורחב 3 Complex numbers arithmetic a + bi + (c + di) = a+c + (b+d)i r1e (i 1) * r2e (i 2) = (r1r2)e (i( 1+ 2))
4
מבוא מורחב 4 High level usage (define (add-complex z1 z2) (make-from-real-imag (+ (real-part z1) (real-part z2)) (+ (imag-part z1) (imag-part z2)))) (define (sub-complex z1 z2) (make-from-real-imag (- (real-part z1) (real-part z2)) (- (imag-part z1) (imag-part z2)))) (define (mul-complex z1 z2) (make-from-mag-ang (* (magnitude z1) (magnitude z2)) (+ (angle z1) (angle z2)))) (define (div-complex z1 z2) (make-from-mag-ang (/ (magnitude z1) (magnitude z2)) (- (angle z1) (angle z2))))
5
מבוא מורחב 5 המימוש שמדמיין אריאל (define (real-part z) (car z)) (define (imag-part z) (cdr z)) (define (make-from-real-imag x y) (cons x y)) (define (magnitude z) (sqrt (+ (square (real-part z)) (square (imag-part z))))) (define (angle z) (atan (imag-part z) (real-part z))) (define (make-from-mag-ang r a) (cons (* r (cos a)) (* r (sin a))))
6
מבוא מורחב 6 המימוש מהזווית של מני (define (make-from-mag-ang r a) (cons r a)) (define (magnitude z) (car z)) (define (angle z) (cdr z)) (define (real-part z) (* (magnitude z) (cos (angle z)))) (define (imag-part z) (* (magnitude z) (sin (angle z)))) (define (make-from-real-imag x y) (cons (sqrt (+ (square x) (square y))) (atan y x)))
7
מבוא מורחב 7 How do we have them both ? ( ' rectangular 3 2) ( ' polar (sqrt 13) (atan 2 3)) We tag the data:
8
מבוא מורחב 8 How do we have them both ? (define (attach-tag type-tag contents) (cons type-tag contents)) (define (type-tag datum) (if (pair? datum) (car datum) (error "Bad tagged datum -- TYPE-TAG" datum))) (define (contents datum) (if (pair? datum) (cdr datum) (error "Bad tagged datum -- CONTENTS" datum))) We tag the data:
9
מבוא מורחב 9 Complex numbers: having both reps. (define (rectangular? z) (eq? (type-tag z) 'rectangular)) (define (polar? z) (eq? (type-tag z) 'polar)) (define (real-part z) (cond ((rectangular? z) (real-part-rectangular (contents z))) ((polar? z) (real-part-polar (contents z))) (else (error "Unknown type -- REAL-PART" z))))
10
מבוא מורחב 10 Complex numbers: having both reps. (define (magnitude z) (cond ((rectangular? z) (magnitude-rectangular (contents z))) ((polar? z) (magnitude-polar (contents z))) (else (error "Unknown type -- MAGNITUDE" z)))) angle, imag-part are similar
11
מבוא מורחב 11 and we have to rename (define (real-part-rectangular z) (car z)) (define (imag-part-rectangular z) (cdr z)) (define (magnitude-rectangular z) (sqrt (+ (square (real-part-rectangular z)) (square (imag-part-rectangular z))))) (define (angle-rectangular z) (atan (imag-part-rectangular z) (real-part-rectangular z))) (define (make-from-real-imag-rectangular x y) (attach-tag 'rectangular (cons x y))) (define (make-from-mag-ang-rectangular r a) (attach-tag 'rectangular (cons (* r (cos a)) (* r (sin a)))))
12
מבוא מורחב 12 and we have to rename (define (real-part-polar z) (* (magnitude-polar z) (cos (angle-polar z)))) (define (imag-part-polar z) (* (magnitude-polar z) (sin (angle-polar z)))) (define (magnitude-polar z) (car z)) (define (angle-polar z) (cdr z)) (define (make-from-real-imag-polar x y) (attach-tag 'polar (cons (sqrt (+ (square x) (square y))) (atan y x)))) (define (make-from-mag-ang-polar r a) (attach-tag 'polar (cons r a)))
13
מבוא מורחב 13 Constructors (define (make-from-real-imag x y) (make-from-real-imag-rectangular x y)) (define (make-from-mag-ang r a) (make-from-mag-ang-polar r a))
14
מבוא מורחב 14 add-complex, sub-complex real-part imag-part magnitude angle polar representation Rectangular representation
15
מבוא מורחב 15 Difficulties ? The generic selectors must know about all reps. Bureacracy (define (real-part z) (cond ((rectangular? z) (real-part-rectangular (contents z))) ((polar? z) (real-part-polar (contents z))) (else (error "Unknown type -- REAL-PART" z)))) Care about name clashes ==> Implementation is not additive Care about when there is a tag and when there isn’t
16
מבוא מורחב 16 Data directed programming work directly with the table: types operations Polar Rectangular real-part imag-part magnitude angle real-part-polar imag-part-polar magnitude-polar angle-polar real-part-rectangular imag-part-rectangular magnitude-rectangular angle-rectangular
17
מבוא מורחב 17 Data-directed programming (Cont) Assume we have (put ) (get ) will do them later in the course.
18
מבוא מורחב 18 Data-directed programming (Cont) Assume we have (put ) (get ) will do them later in the course.
19
19 Rectangular implementation (define (install-rectangular-package) ;; internal procedures (define (real-part z) (car z)) (define (imag-part z) (cdr z))... (define (make-from-mag-ang r a) (cons (* r (cos a)) (* r (sin a)))) ;; interface to the rest of the system (define (tag x) (attach-tag 'rectangular x)) (put 'real-part '(rectangular) real-part) (put 'imag-part '(rectangular) imag-part) (put 'magnitude '(rectangular) magnitude) (put 'angle '(rectangular) angle) (put 'make-from-real-imag 'rectangular (lambda (x y) (tag (make-from-real-imag x y)))) (put 'make-from-mag-ang 'rectangular (lambda (r a) (tag (make-from-mag-ang r a)))) 'done)
20
20 Polar implementation (define (install-polar-package) ;; internal procedures (define (magnitude z) (car z)) (define (angle z) (cdr z))... (define (make-from-real-imag x y) (cons (sqrt (+ (square x) (square y))) (atan y x))) ;; interface to the rest of the system (define (tag x) (attach-tag 'polar x)) (put 'real-part '(polar) real-part) (put 'imag-part '(polar) imag-part) (put 'magnitude '(polar) magnitude) (put 'angle '(polar) angle) (put 'make-from-real-imag 'polar (lambda (x y) (tag (make-from-real-imag x y)))) (put 'make-from-mag-ang 'polar (lambda (r a) (tag (make-from-mag-ang r a)))) 'done)
21
מבוא מורחב 21 Generic selectors (define (real-part z) (apply-generic 'real-part z)) (define (imag-part z) (apply-generic 'imag-part z)) (define (magnitude z) (apply-generic 'magnitude z)) (define (angle z) (apply-generic 'angle z))
22
מבוא מורחב 22 apply-generic (simple version) (define (simple-apply-generic op arg) (let ((type-tag (type-tag arg))) (let ((proc (get op (list type-tag)))) (if proc (proc (contents arg)) (error "No method for these types -- APPLY-GENERIC" (list op type-tag))))))
23
מבוא מורחב 23 apply-generic (define (apply-generic op. args) (let ((type-tags (map type-tag args))) (let ((proc (get op type-tags))) (if proc (apply proc (map contents args)) (error "No method for these types -- APPLY-GENERIC" (list op type-tags)))))) (apply + (list 1 2 3 4)) ==> 10
24
מבוא מורחב 24 Finally (define (make-from-real-imag x y) ((get 'make-from-real-imag 'rectangular) x y)) (define (make-from-mag-ang r a) ((get 'make-from-mag-ang 'polar) r a))
25
מבוא מורחב 25 Alternative -- message passing style Make “intelligent” data objects. decompose the table by column types operations Polar Rectangular real-part imag-part magnitude angle real-part-polar imag-part-polar magnitude-polar angle-polar real-part-rectangular imag-part-rectangular magnitude-rectangular angle-rectangular
26
מבוא מורחב 26 Message passing style (define (make-from-real-imag x y) (define (dispatch op) (cond ((eq? op 'real-part) x) ((eq? op 'imag-part) y) ((eq? op 'magnitude) (sqrt (+ (square x) (square y)))) ((eq? op 'angle) (atan y x)) (else (error "Unknown op -- MAKE-FROM-REAL-IMAG" op)))) dispatch) (define (apply-generic op arg) (arg op))
27
מבוא מורחב 27 Midterm last spring ממש / י שגרה (add-ind init lst) שמקבלת כקלט אינדקס התחלתי init ורשימה lst ומחזירה רשימה שאיבריה הם זוגות. האיברים הראשונים בזוגות הם אינדקסים רצים שמתחילים ב -init. האיברים השניים בזוגות הם איברי הרשימה lst. לדוגמא : (add-ind 0 (list 5 2 7)) ==> ((0. 5) (1. 2) (2. 7)) (define (add-ind init lst) (if (null? lst) nil (cons (cons init (car lst)) (add-ind (+ 1 init) (cdr lst)))))
28
מבוא מורחב 28 Midterm last spring (cont) השלם / י את מימוש השגרה (max-ind lst-ind) שמקבלת רשימה שהתקבלה מהפעלת add-ind על רשימת מספרים, ומחזירה את הזוג שבו האיבר השני הוא הגדול ביותר. לדוגמא : (max-ind (add-ind 0 (list 10 17 2 5))) ==> (1. 17) (define (max-ind lst-ind) (accumulate ________________________________ ____________ )) lst-ind (lambda (x y) (if (> (cdr x) (cdr y)) x y)) (car lst-ind)
29
מבוא מורחב 29 Midterm last spring (Cont) תהא lst רשימת מספרים שכל איבריה שונים. הגדר שגרה (break-list lst) שמחזירה רשימה באורך שלוש. האיבר הראשון ברשימה שמוחזרת היא רשימת איברי lst שמופיעים לפני האיבר המירבי של lst. האיבר השני ברשימה הוא האיבר המירבי ב -lst. האיבר השלישי הוא רשימת איברי lst שמופיעים לאחר האיבר המירבי. לדוגמא : (break-list ‘(1 8 3 6 4 9 2 5 7)) ( (1 8 3 6 4) 9 (2 5 7) ) (break-list ‘(5 4 3 2 1)) ( () 5 (4 3 2 1) ) (break-list ‘(7)) ( () 7 () )
30
מבוא מורחב 30 Midterm last spring (Cont) (define (break-lst lst) (let ((lst-ind (add-ind lst))) (let ((maxi (max-ind lst-ind))) (list (map ______________________________ (filter _______________________________ lst-ind)) ____________ (map ______________________________ (filter _______________________________ lst-ind)) )))) (cdr maxi) cdr (lambda (x) (< (car x) (car maxi))) (lambda (x) (> (car x) (car maxi)))
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.