470 likes | 478 Views
מבוא מורחב למדעי המחשב בשפת Scheme. תרגול 10. אג'נדה. שאלות מבחינות חזרה על מימוש stream אפשרי. 2. convert. יש לממש את הפונקציה (convert num base) . הפונקציה מחזירה רשימה המייצגת את ספרותיו של num בבסיס base בסדר הפוך (ספרת האחדות ראשונה). (define (convert num base)
E N D
מבוא מורחב למדעי המחשב בשפת Scheme תרגול 10
אג'נדה • שאלות מבחינות • חזרה על מימוש stream אפשרי 2
convert יש לממש את הפונקציה (convert num base). הפונקציה מחזירה רשימה המייצגת את ספרותיו של num בבסיס base בסדר הפוך (ספרת האחדות ראשונה) (define (convert num base) (if (= num 0) '() ______________________________ ______________________________ ______________________________ ______________________________ )) (cons (remainder num base) (convert (quotient num base) base)) 3
convert-all • - numbersזרם (אולי אינסופי) של מספרים. • bases - רשימה של מספרים. • ממשו את הפונקציה (convert-all numbers bases) שמחזירה רשימה של זרמים כך שהזרם ה-iברשימה מכיל את הייצוג של כל המספרים ב-numbers לפי המספר ה-iב-bases (כל ייצוג כזה הוא רשימה בעצמו). > (define N (cons-stream 5 (cons-stream 11 (cons-stream 35 …)))) > (define B (list 2 3 4)) > (convert-all N B) ([(1 0 1)(1 1 0 1)(1 1 0 0 0 1)…] [(2 1)(2 0 1)(2 2 0 1)…] [(1 1)(3 2)(3 0 2)…]) 4
convert-all (define (convert-all numbers bases) __________________________________ __________________________________ __________________________________ __________________________________ __________________________________ __________________________________ ) (map (lambda (base) (stream-map (lambda (x) (convert x base)) numbers)) bases)) 5
common-digits-all • ממשו את הפונקציה (common-digits-all numbers bases). • הפונקציה מחזירה רשימה של זרמים המכילים #t ו-#f לפי הכלל הבא: • במקום ה-k בזרם ה-i יופיע #t אם בייצוג לפי בסיס basei שלnumberskו- numbersk+1 יש סיפרה משותפת. אחרת יופיע #f. • ניתן להשתמש בפונקצית העזר (common-digit? L1 L2) המחזירה #t אם יש ספרה משותפת ל-L1 ו- L2 ,ו-#fאחרת. 6
common-digit-all (define (common-digit-all nums bases) __________________________________ __________________________________ __________________________________ __________________________________ __________________________________ __________________________________ __________________________________ ) (map (lambda (base) (stream-map (lambda (n1 n2) (common-digit? (convert n1 base) (convert n2 base))) (stream-cdr numbers) numbers)) bases)) 7
in-sorted? • ממשו את הפונקצייה in-sorted? המקבלת מספר ו-stream אינסופי של מספרים ממוינים בסדר עולה. הפונקציה מחזירה #t אם המספר שהיא מקבלת נמצא בתוך ה-stream ו- #f אחרת. • לדוגמא: (in-sorted? 13 fibs) צריך להחזיר #t כי 13 הינו מספר פיבונצ'י ו-(in-sorted? 14 stream-of-fibs) צריך להחזיר #f כי 14 איננו מספר פיבונצ'י. 8
in-sorted? (define in-sorted? (lambda (x stream) (let ((e (__________ stream))) (or (= x e) (______ (____ x e) (__________ x (__________ stream)) ))))) stream-car and > in-sorted? stream-cdr 9
merge-inc • ממשו את הפונקצייה merge-inc המקבלת שני streams אינסופיים של מספרים ממוינים בסדר עולה. הפונקציה מחזירה stream אינסופי ממוין בסדר עולה המתקבל ממיזוגם של ה-streams הנתונים. אם ישנו מספר המשותף לשני ה-streams אזי הוא יופיע פעמיים ב-stream התוצאה. • לדוגמא: (merge-inc fibs (stream-map (lambda (x) (* x 10)) fibs))) צריך להחזיר [0 0 1 1 2 3 5 8 10 10 ] 10
merge-inc (define (merge-inc s1 s2) (let ((e1 (__________ s1)) (e2 (__________ s2))) (if (___ e1 e2) (___________ e1 (merge-inc (__________ s1) s2)) (___________ e2 (merge-inc s1 (__________ s2)) ))))) stream-car stream-car < cons-stream stream-cdr cons-stream stream-cdr 11
stream-conv • נגדיר קונבולוציה בין רשימת מספרים(a1 a2 .. an) ו-stream אינסופי של מספרים [b1 b2 b3 …]להיות stream אינסופי של מספרים[c1 c2 c3 … ] כך ש- ci= a1*bi+a2*bi+1 ... an*bi+n • ממשו את הפונקצייהstream-conv המחשבת את זרם הקונבולוציה עפ"י ההגדרה הנ"ל. • לדוגמא: (stream-conv ‘(1 2) fibs) צריך להחזיר [2 3 5 8 13 21 34 55 89……] 12
stream-conv (define (stream-conv lst str) (define (first-term lst str) (if (null? lst) ___ (___ (* (car lst) (__________ str)) (first-term (__________ lst) (__________ str) )))) (___________ (first-term lst str) (stream-conv lst (__________ str)) )) 0 + stream-car cdr stream-cdr cons-stream stream-cdr 13
stream-conv • מהם ערכי x1 ו-x2 בסוף השערוך? / 1 / 2 (define x1 0) (define x2 0) (define str1 (cons-stream 1 (begin (set! x1 (+ x1 1)) str1))) (define (integers n) (cons-stream n (begin (set! x2 (+ x2 1)) (integers (+ n 1))))) (define str2 (integers 1)) (define c1 (stream-conv '(1 1) str1)) (define c2 (stream-conv '(1 1) str2)) 14
מודל הסביבות • ציירו את מהלך השערוך של הביטוי הבא במודל הסביבות. מהי תוצאת השערוך? (let ((f (lambda (x) (+ x 3)))) (define y (lambda (g) (lambda (y) (f (g y))))) ((y f) 3)) 15
מודל הסביבות GE (let ((f (lambda (x) (+ x 3)))) ...) => ((lambda (f) ...) (lambda (x) (+ x 3) 16
מודל הסביבות GE L1 p: fb: (define y … ((lambda (f) ...) (lambda (x) (+ x 3) 17
מודל הסביבות GE L2 L1 p: fb: (define y … p: xb:(+ x 3) (L1 (lambda (x) (+ x 3) 18
מודל הסביבות GE L2 L1 p: fb: (define y … p: xb:(+ x 3) (L1 L2) 19
מודל הסביבות GE E1 L2 L1 f: p: fb: (define y … p: xb:(+ x 3) (L1 L2) 20
מודל הסביבות GE E1 L2 L1 f: y: L3 p: fb: (define y … p: xb:(+ x 3) p: gb:(lambda…) (define y (lambda (g) (lambda (y) (f (g y))))) | E1 21
מודל הסביבות GE E1 L2 L1 f: y: L3 p: fb: (define y … p: xb:(+ x 3) p: gb:(lambda…) ((y f) 3) | E1 22
מודל הסביבות GE E1 L2 L1 f: y: L3 p: fb: (define y … p: xb:(+ x 3) p: gb:(lambda…) ((L3 f) 3) | E1 23
מודל הסביבות GE E1 E2 L2 L1 f: y: g: L3 p: fb: (define y … p: xb:(+ x 3) p: gb:(lambda (y) (f (g y))) ((L3 f) 3) | E1 24
מודל הסביבות GE E1 E2 L2 L1 f: y: g: L3 p: fb: (define y … p: xb:(+ x 3) p: gb:(lambda (y) (f (g y))) (lambda (y) (f (g y)) | E2 25
מודל הסביבות GE E1 E2 L2 L1 f: y: g: L4 L3 p: fb: (define y … p: xb:(+ x 3) p: yb:(f (g y)) p: gb:(…) (L4 3) | E1 26
מודל הסביבות GE E1 E2 E3 L1 L2 f: y: g: y:3 L4 L3 p: fb: … p: xb:(+ x 3) p: yb:(f (g y)) p: gb:(…) (L4 3) | E1 27
מודל הסביבות GE E1 E2 E3 L1 L2 f: y: g: y:3 L4 L3 p: fb: … p: xb:(+ x 3) p: yb:(f (g y)) p: gb:(…) (f (g y)) | E3 => (f 6) | E3 => 9 28
מימוש stream • מנגנוני force/delay • delay הוא special form (delay <exp>) => (lambda () <exp>) (force <delayed-exp>) => ((<delayed-exp>)) => ((lambda () <exp>)) => <exp> 30
מימוש stream • memoization (define (memo-proc proc) (let ((already-run? #f) (result #f)) (lambda () (if (not already-run?) (begin (set! result (proc)) (set! already-run? #t) result) result)))) 31
מימוש stream • הגדרה מתוקנת עבור delay: • ולכן: (delay <exp>) => (memo-proc (lambda () <exp>)) (cons-stream a b) => (cons a (delay b)) 32
streams x:0 GE (define ones (cons-stream 1 (begin (set! x (+ x 1)) ones)) 33
streams x:0 GE (define ones (cons 1 (delay (begin (set! x (+ x 1)) ones))) 34
streams x:0 GE (define ones (cons 1 (memo-proc(lambda () ...))) 35
streams x:0 ones: GE proc: p:-b:(begin…) already-run:#f result: #f 1 p:-b:… (define ones (cons 1 (memo-proc(lambda () ...))) 36
streams x:0 ones: GE proc: p:-b:(begin…) already-run:#f result: #f 1 p:-b:… (stream-cdr ones) 37
streams x:0 ones: GE proc: p:-b:(begin…) already-run:#f result: #f 1 p:-b:… (force (cdr ones)) 38
streams x:0 ones: GE proc: p:-b:(begin…) already-run:#f result: #f 1 p:-b:… ((cdr ones)) 39
streams x:0 ones: GE proc: p:-b:(begin…) already-run:#f result: #f 1 p:-b:… (not already-run) is #t => (set! result (proc)) 40
streams x:0 ones: GE proc: p:-b:(begin…) already-run:#f result: #f 1 p:-b:… (begin (set! x (+ x 1)) ones) 41
streams / x:01 ones: GE proc: p:-b:(begin…) already-run:#f result: #f 1 p:-b:… (begin (set! x (+ x 1)) ones) 42
streams / x:01 ones: GE proc: p:-b:(begin…) already-run:#f #t result: #f 1 p:-b:… (set! already-run #t) 43
streams / x:01 ones: GE proc: p:-b:(begin…) already-run:#f #t result: #f 1 p:-b:… (stream-cdr ones) 44
streams / x:01 ones: GE proc: p:-b:(begin…) already-run:#f #t result: #f 1 p:-b:… ((cdr ones)) 45
streams / x:01 ones: GE proc: p:-b:(begin…) already-run:#f #t result: #f 1 p:-b:… (not already-run) is #f => result 46
streams / x:01 ones: GE proc: p:-b:(begin…) already-run:#f #t result: #f 1 p:-b:… 47