html5-img
1 / 49

תכנות פונקציונאלי - II

תכנות פונקציונאלי - II. רקורסיה מבוסס על: לירון, א., לפידות ת., לוי, ד. ופז, ת. (1999). תכנות פונקציונאלי – פרדיגמה תכנותית נוספת , המרכז הישראלי להוראת המדעים. תכנות פונקציונאלי - תיאורים רקורסיביים. להלן שלושה תיאורים רקורסיביים. לכל תיאור, ציירו את הציור המתאים לרמה 3.

linda-reese
Télécharger la présentation

תכנות פונקציונאלי - II

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. תכנות פונקציונאלי - II רקורסיה מבוסס על:לירון, א., לפידות ת., לוי, ד. ופז, ת. (1999). תכנות פונקציונאלי – פרדיגמה תכנותית נוספת, המרכז הישראלי להוראת המדעים.

  2. תכנות פונקציונאלי - תיאורים רקורסיביים להלן שלושה תיאורים רקורסיביים. לכל תיאור, ציירו את הציור המתאים לרמה 3. • מגדל ברמה N בנוי ממשולש שעליו מונח מגדל קטן יותר ברמהN-1. • המגדל הבסיסי הוא ברמה 1, וצורתו משולש  . • עץ בינארי ברמה N בנוי מצורת V שבכל אחת מקצותיה עץ בינארי קטן יותר ברמהN-1. • העץ הבסיסי הוא ברמה 1, וצורתו V. • שטיח ברמה N בנוי מריבוע שבכל אחד מקדקודיו שטיח קטן יותר ברמהN-1. • השטיח הבסיסי הוא ברמה 1, וצורתו ריבוע.

  3. תכנות פונקציונאלי - תיאורים רקורסיביים • נתונים תיאורים רקורסיביים. לכל תיאור, רשמו מספר ביטויים המתאימים לתיאור. • פלינדרום הוא מילה שהאות הראשונה והאחרונה שלה זהות, וביניהן נמצא פלינדרום קצר יותר. הפלינדרום הבסיסי מכיל אות אחת (כרצונכם). • מילה חוקית בשפת דג מתחילה באות ד' ומסתיימת באות ג', וביניהן נמצאת מילה חוקית קצרה יותר בשפת דג. המילה החוקית הבסיסית היא המילה הריקה (ללא תווים).

  4. תכנות פונקציונאלי - תיאורים רקורסיביים • נתונים ארבעה תיאורים רקורסיביים. לכל תיאור, רשמו מספר ביטויים המתאימים לתיאור. • ביטוי חוקי נפתח בתו A , מסתיים בתו B, וביניהם נמצא ביטוי חוקי קצר יותר. הביטוי החוקי הבסיסי הוא התו C. • ביטוי חוקי נפתח בתו A, מסתיים בתו B, וביניהם נמצאים שני ביטויים חוקיים קצרים יותר. הביטוי החוקי הבסיסי הוא התו C .

  5. תכנות פונקציונאלי – מציור לתיאור רקורסיבי תנו לעץ תיאור רקורסיבי.

  6. תכנות פונקציונאלי - סיכום: חשיבה רקורסיבית • רקורסיה היא תופעה מיוחדת המופיעה בתחומים רבים. • הגדרה רקורסיבית של מושג היא הגדרה שבה מגדירים את המושג בעזרת הגדרה פשוטה יותר של אותו מושג. • חשוב לתת למושג שם שמתאר אותו. • המושג יכול להיות ציור, מילה, סדרה חשבונית, מבנה, או תהליך.

  7. תכנות פונקציונאלי - סיכום: חשיבה רקורסיבית • הגדרה רקורסיבית מורכבת בדרך-כלל משני חלקים: • המקרה הבסיסי (הפשוט) ביותר, הנקרא גם תנאי העצירה. • המקרה הכללי, הנקרא גם הקריאה הרקורסיבית, המתאר את התופעה (המושג) בעזרת הגדרה פשוטה יותר של אותה תופעה (מושג).

  8. תכנות פונקציונאלי - פונקציות רקורסיביות • נבנה אלגוריתם רקורסיבי לחישוב סכום האברים ברשימת מספרים. • נסחו את הפתרון באופן מילולי. • תרגמו את הפתרון המילולי לפונקציה.

  9. תכנות פונקציונאלי - פונקציות רקורסיביות חישוב סכום אברי רשימה )define (sum_list l( (cond [(empty? l) 0[ [(+ (first l) (sum_list (rest l)))]))

  10. תכנות פונקציונאלי - פונקציות רקורסיביות • אלגוריתם רקורסיבי לחישוב סכום האברים הזוגיים ברשימת מספרים. • נסחו את הפתרון באופן מילולי. • תרגמו את הפתרון המילולי לפונקציה.

  11. תכנות פונקציונאלי - פונקציות רקורסיביות סכום האברים הזוגיים ברשימה )define (sum_even l) (cond [(empty? l) 0] [(even? (first l)) (+ (first l) (sum_even (rest l)))] [else (sum_even (rest l))]))

  12. תכנות פונקציונאלי - פונקציות רקורסיביות הוצאת איבר מרשימה • דוגמאות: • אם נוציא מהרשימה(10 20 30 40) את האיבר השני, נקבל את הרשימה (10 30 40). • אם נוציא מהרשימה (what a nice day) את האיבר השלישי, נקבל את הרשימה (what a day). • באופן כללי: הפונקציה קולטת מספר i גדול מ- 0 ורשימה, ומחזירה את הרשימה ללא האיבר ה- i-י.

  13. תכנות פונקציונאלי - פונקציות רקורסיביות בניה הדרגתית של הפונקציה. • נכתוב פונקציה without-1 המקבלת רשימה ומחזירה אותה ללא האיבר הראשון. • למשל: (without-1 ‘( 10 20 30 40 ) ) תחזיר (20 30 40). (define (without_1 l) (rest l))

  14. תכנות פונקציונאלי - פונקציות רקורסיביות • נכתוב פונקציה without-2 המקבלת רשימה ומחזירה אותה ללא האיבר השני. • למשל, (without-2 ‘( 10 20 30 40 ) ) תחזיר (10 30 40). (define (without_2 l) (cons (first l)(without_1 (rest l))))

  15. תכנות פונקציונאלי - פונקציות רקורסיביות • האם ניתן להיעזר בפונקציות הקודמות לכתיבת without-3? • נניח שהרשימה המקורית היא (10 20 30 40 50 60). נבדוק מה יחזירו הפונקציות הקודמות • (without_1 ‘(10 20 30 40 50 60))  ( 20 30 40 50 60) • (without_2 ‘(10 20 30 40 50 60))  ( 10 30 40 50 60) • כעת נכתוב פונקציה שתוציא מהרשימה את האיבר השלישי שלה. • (without_3 ‘(10 20 30 40 50 60))  ( 10 20 40 50 60 )

  16. תכנות פונקציונאלי - פונקציות רקורסיביות • כדי להוציא מרשימה את האיבר השלישי שלה, ניתן להחזיר את האיבר הראשון לרשימה המתקבלת מהוצאת האיבר השני מהרשימה ללא האיבר הראשון. (define (without_3 l) (cons (first l)(without_2 (rest l)))) • נשלים את הפונקציה המוציאה מרשימה את האיבר הרביעי שלה.

  17. תכנות פונקציונאלי - פונקציות רקורסיביות • מה משותף לפונקציות האחרונות? • כיצד ניתן להשתמש במשותף לפונקציות הקודמות בבניית הפונקציה הכללית without?

  18. תכנות פונקציונאלי - פונקציות רקורסיביות • הפונקציה without המוציאה מרשימה L את האיבר הנמצא במקום n. (define (without n L) (cond [(= n 1) (rest L)] [else (cons (first L) (without (sub1 n) (rest L)))])) • מדוע תנאי העצירה הוא (= n 1) ? • מדוע במקרה זה מוחזרת שארית הרשימה (rest L)?

  19. תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות • upto ("עד ל-" ):הפונקציה מקבלת רשימה L ואינדקס n ומחזירה את nהאיברים הראשונים ברשימה (עד לאיבר ה- n, כולל איבר זה). > (upto 3 ‘( alon gila roni miri moti yael )) (alon gila roni ) > (upto 2 ‘( 10 (2.5 3.5) x hello )) (10 (2.5 3.5 ) ) • בתהליך דומה לתהליך הקודם ניתן לבנות את הפונקציה: (define (upto n l) (cond [(= n 1)(cons (first l) '())] [else (cons (first l) (upto (sub1 n)(rest l)))]))

  20. תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות • הפונקציה from ( "מ-" ): הפונקציה מקבלת רשימה L ואינדקס n ומחזירה את איברי הרשימה מהמקום ה-n ואילך. > (from 3 ‘( alon gila roni miri moti yael)) (roni miri moti yael ) > (from 2 ‘( 10 (2.5 3.5) x hello)) ((2.5 3.5) x hello) (define (from n l) (cond [(= n 1) l] [else (rest (from (sub1 n) l))]))

  21. תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות • הניחו כי הכלים from, upto קיימים. • בנו באמצעותם פונקציה חדשה - (between L a b), המחזירה את איברי הרשימה L מהמקום a עד המקום b. > (between ‘( alon gila roni miri moti yael ) 3 5) (roni miri moti ) > ( between ‘( 10 (2.5 3.5) x hello ) 2 3 ) ( ( 2.5 3.5 ) x ) • הפונקציה between איננה רקורסיבית.

  22. תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות • הפונקציה (between L a b) המחזירה את איברי הרשימה L מהמקום a עד המקום b: (define (between l a b) (upto (add1 (- b a)) (from a l))) > (between '(1 2 3 4 5 6 7) 2 4) (2 3 4) > (between '(1 2 3 4 5 6 7) 2 7) (2 3 4 5 6 7) > (between '(1 2 3 4 5 6 7) 4 4) (4)

  23. תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות • הפונקציה (between L a b) המחזירה את איברי הרשימה L מהמקום a עד המקום b: (define (between l a b) (upto (add1 (- b a)) (from a l))) מה תהיה תגובת המחשב להוראות הבאות: > (between '(1 2 3 4 5 6 7) 1 8) > (between '(1 2 3 4 5 6 7) 1 7) > (between '(1 2 3 4 5 6 7) 3 2)

  24. תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות • השתמשו בכלים from ו- upto להגדרת הפונקציה (insert L x n), המכניסה את האיבר x למקום ה- n ברשימה L. • דוגמאות: • (insert ‘(alon dalya roni miri) ‘gadi 3) • (alon dalya gadi roni miri) • (insert ‘(10 (2.5 3.5) x hello) ‘(a b c) 2) • (10 (a b c) (2.5 3.5) x hello) • הגדירו את הפונקציה insert כפונקציה רקורסיבית, ללא שימוש בכלים fromו- .upto

  25. תכנות פונקציונאלי - פונקציות רקורסיביות • נושאים נוספים: • מסננות קלט: • מהן • בנייתן • באופן פשוט לבדיקת אופיו של אובייקט מסוים • בהמשך - לבדיקת אופיין של רשימות • בדיקות • מודל האנשים הקטנים

  26. תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map) • פונקציה המקבלת רשימת מספרים חיוביים ומחזירה רשימה של שורשי המספרים. • עבור הרשימה ‘(100 64 0 25 1) תוחזר הרשימה (10 8 0 5 1 ). • פונקציה המקבלת רשימה של רשימות לא ריקות ומחזירה רשימה של איבריהם הראשונים. • עבור ‘((my cat) (good morning) (dad and mom)) תוחזר הרשימה (my good dad).

  27. תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map) • פונקציה המקבלת רשימת מספרים חיוביים ומחזירה רשימה של שורשי המספרים. (define (sqrt_list l) (cond [(empty? l) l] [else (cons (sqrt (first l)) (sqrt_list (rest l)))]))

  28. תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map) • פונקציה המקבלת רשימה של רשימות לא ריקות ומחזירה רשימה של איבריהם הראשונים. (define (first_list l) (cond [(empty? l) l] [else (cons (first (first l)) (first_list (rest l)))]))

  29. תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map) • הפונקציות הנ"ל מקבלות רשימה (רשימת קלט) ומחזירות רשימה (רשימת פלט). • לכל איבר ברשימת הקלט מותאם איבר ברשימת הפלט. • התאמה כזו נקראת פונקצית מיפוי.

  30. תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map) • דוגמאות נוספות לפונקציות מיפוי.

  31. תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map) • פונקציה MAP הקולטת את פונקצית המיפוי ורשימה ומבצעת את המיפוי. )define (map list operation) (cond [(empty? list ) '()] [else (cons (operation (first list)) (map (rest list) operation))])) > (map '(8 7 6) add1) (9 8 7) > (map '(16 0 6) sqrt) (4 0 2.4494897427832)

  32. תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter) • כתבו פונקציה רקורסיבית המקבלת רשימה כלשהי ומחזירה רשימה רק עם המספרים שבה. • נסחו את הפתרון באופן מילולי. • תרגמו את הפתרון המילולי לפונקציה.

  33. תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter) • כתבו פונקציה רקורסיבית המקבלת רשימה כלשהי ומחזירה רשימה רק עם המספרים שבה. )define (only_numbers l) (cond [(empty? l ['() ( [(number? (first l)) (cons (first l) (only_numbers (rest l [((( [else (only_numbers (rest l))]))

  34. תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter) • הפונקציה הבאה מקבלת רשימת מספרים. (define (sod L) (cond [ ( empty? L ) ‘( ) ] [ (negative? (first L ) ) ( sod ( rest L ) ) ] [ else (cons ( sqrt (first L)) (sod (rest L )))])) • מה מחזירה הפונקציה עבור הרשימות הבאות? (64 -4 100 25 -25 ) (1 49 -9 -16 81 4 ) • מה מבצעת הפונקציה? • תנו לפונקציה שם משמעותי.

  35. תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter) • כתבו פונקציה שמקבלת רשימה כלשהי ובונה רשימה חדשה ללא הרשימות שבה. (define (not_list l) (cond [(empty? l) '()] [(list? (first l)) (not_list (rest l))] [else (cons (first l) (not_list (rest l)))]))

  36. תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter) • הפונקציות הנ"ל מקבלות רשימה (רשימת קלט) ומחזירות רשימה (רשימת פלט) שנמצאים בה רק האיברים המקיימים תנאי מסוים. • פונקציות מסוג זה נקראות פונקצית סינון. • הציעו דוגמאות נוספות לפונקציות סינון. • כתבו את הפונקציה filter (מהם קלטיה?)

  37. תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter) פונקצית סינון הקולטת את פונקצית המיפוי ורשימה ומבצעת את הסינון. (define (filter l predicate) (cond [(empty? l) '()] [(predicate (first l)) (cons (first l) (filter (rest l) predicate))] [else (filter (rest l) predicate)]))

  38. תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter) • כתיבת פרדיקטים היכולים לשמש כקלט לפונקצית סינון. • השתמשו בפונקציה filter וכתבו ביטוי הקולט רשימת מספרים ומחזיר רשימה שמצויים בה רק המספרים המתחלקים ב- 6. (define (divide_6? x) (= (reminder x 6) 0)) > (divide_6? 8( #f > )divide_6? 12( #t >) filter '(4 6 12 67 60 180) divide_6(? (6 12 60 180)

  39. תכנות פונקציונאלי - פונקציות רקורסיביות, צמצום (reduce) • כתבנו פונקציה הקולטת רשימת מספרים ומחזירה את סכומם. • פרדיקטים: • כתבו פונקציה הקולטת רשימה ומחזירה #t אם כל איברי הרשימה הם רשימות ו- #f אחרת. • כתבו פונקציה הקולטת רשימת מספרים ומחזירה #t אם כל איברי הרשימה זוגיים ו- #f אחרת.

  40. תכנות פונקציונאלי - פונקציות רקורסיביות, צמצום (reduce) • הפונקציות הנ"ל הן פונקציות צמצום היות והן קולטות רשימה ומחזירות מספר או ערך בוליאני. • כתבו את הפונקציה reduce. • מהם קלטיה? • האם ניתן לתפוס את כל המקרים בפונקציה אחת?

  41. תכנות פונקציונאלי - map, filter, reduce • פונקציות הן first order objects • המושג הפשטה

  42. תכנות פונקציונאלי • תרגיל: • רשמו ביטוי הקולט רשימה ומחזיר את מספר האיברים הגדולים מממוצע המספרים ברשימה.

  43. תכנות פונקציונאלי • אין השמה, אין אפשרות לשים ערכים בזיכרון (בדומה למתמטיקה) • פתרון: בעזרת פונקציות. • פתרון התרגיל באופן מסורתי: • חישוב הממוצע והשמתו במשתנה. • ספירת מספר האיברים הגדולים מהממוצע. • בתכנות פונקציונאלי: הרכבת פונקציות.

  44. תכנות פונקציונאלי • פונקציה הקולטת רשימה ומחזירה את מספר האיברים הגדולים מממוצע איברי הרשימה. )define (sup-big-than-average l) (big-than-average l (average l))) )define (big-than-average l average) (cond [(empty? l) 0 ] ](> (first l) average) (add1 (big-than-average (rest l) average))] ]else (big-than-average (rest l) average)]))

  45. תכנות פונקציונאלי • רשמו ביטוי שהקלט שלו הוא רשימה המחזיר את מספר האיברים הגדולים מממוצע איברי הרשימה. • הגדרת פונקצית-על על-מנת לשמור את הממוצע של הרשימה המקורית.

  46. תכנות פונקציונאלי, פונקציות רקורסיביות, סיכום • פונקציה רקורסיבית היא פונקציה הקוראת לעצמה. או ליתר דיוק, גורמת להפעלה חוזרת של אותה הפונקציה אבל בדרך-כלל עם ערכי פרמטרים שונים. מרכיבים בסיסיים בפונקציה רקורסיבית: • תנאי עצירה (מקרה בסיסי) שפועל על אחד מהפרמטרים של הפונקציה. • תנאי העצירה מגדיר מה מחזירה הפונקציה במקרה הפשוט ביותר (המקרה הבסיסי). • קריאה רקורסיבית או צעד רקורסיבי שגורם להפעלה החוזרת. • שינוי הפרמטרים בקריאה הרקורסיבית צריך להיות "בכיוון" של תנאי העצירה. • אם אין שינוי בפרמטר המתאים, הפונקציה (התהליך) לא תעצור.

  47. תכנות פונקציונאלי, פונקציות רקורסיביות, סיכום סוגי רקורסיה: • רקורסית קצה (tail recursion) - יוצרת תהליך חישובי איטרטיבי (לולאה). • רקורסיה אמיתית (מלאה) - יוצרת תהליך רקורסיבי מלא. • רקורסיה לינארית (חד-ממדית) מכילה קריאה רקורסיבית יחידה. • רקורסיה מורכבת (רב-ממדית) מכילה יותר מקריאה רקורסיבית אחת.

  48. תכנות פונקציונאלי • פונקציות והרכבתם • פונקציות הן איבר מסדר ראשון • אין השמה • רעיונות נלווים של מדעי המחשב : • מסננת קלט • בדיקות • רקורסיה • מבני נתונים • מבנה בסיסי - רשימה • בהמשך נבנה ממבנה זה מבנים מורכבים יותר

  49. תכנות פונקציונאלי – דיון • באיזה מובן סוג התכנות שחווינו מהווה פרדיגמה תכנותית?

More Related