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

49
ייייי ייייייייייי- II ייייייי ללללל לל: ייייי, י., יייייי י.,( . ייי, י. ייי, י1999 .) תתתתת תתתתתתתתתתת – תתתתתתת תתתתתתת תתתתת, .ייייי ייייייי יייייי יייייי

Upload: linda-reese

Post on 30-Dec-2015

39 views

Category:

Documents


3 download

DESCRIPTION

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

TRANSCRIPT

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

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

רקורסיהלירון, א., לפידות ת., לוי, ד. ופז, ת. מבוסס על:

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

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

תכנות פונקציונאלי - תיאורים רקורסיביים

להלן שלושה תיאורים רקורסיביים. לכל תיאור, ציירו את הציור .3המתאים לרמה

ברמה מגדל N קטן יותר ברמה מגדל בנוי ממשולש שעליו מונחN-1 . וצורתו משולש 1המגדל הבסיסי הוא ברמה ,.

ברמה עץ בינארי N בנוי מצורת V קטן יותר עץ בינארי שבכל אחת מקצותיה.N-1ברמה

וצורתו 1העץ הבסיסי הוא ברמה ,V.

ברמה שטיחN קטן יותר ברמה שטיח בנוי מריבוע שבכל אחד מקדקודיוN-1. וצורתו ריבוע. 1השטיח הבסיסי הוא ברמה ,

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

תכנות פונקציונאלי - תיאורים רקורסיביים

נתונים תיאורים רקורסיביים. לכל תיאור, רשמו

מספר ביטויים המתאימים לתיאור.

פלינדרום הוא מילה שהאות הראשונה והאחרונה שלה

זהות, וביניהן נמצא פלינדרום קצר יותר. הפלינדרום

הבסיסי מכיל אות אחת )כרצונכם(.

מילה חוקית בשפת דג מתחילה באות ד' ומסתיימת באות

ג', וביניהן נמצאת מילה חוקית קצרה יותר בשפת דג.

המילה החוקית הבסיסית היא המילה הריקה )ללא תווים(.

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

תכנות פונקציונאלי - תיאורים רקורסיביים

,נתונים ארבעה תיאורים רקורסיביים. לכל תיאור

רשמו מספר ביטויים המתאימים לתיאור.

ביטוי חוקי נפתח בתוA מסתיים בתו ,B וביניהם ,

נמצא ביטוי חוקי קצר יותר. הביטוי החוקי הבסיסי הוא

.Cהתו

ביטוי חוקי נפתח בתוA מסתיים בתו ,B וביניהם ,

נמצאים שני ביטויים חוקיים קצרים יותר. הביטוי החוקי

. Cהבסיסי הוא התו

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

תכנות פונקציונאלי – מציור לתיאור רקורסיבי

תנו לעץ תיאור רקורסיבי.

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

סיכום: חשיבה תכנות פונקציונאלי - רקורסיבית

.רקורסיה היא תופעה מיוחדת המופיעה בתחומים רבים

הגדרה רקורסיבית של מושג היא הגדרה שבה מגדירים

את המושג בעזרת הגדרה פשוטה יותר של אותו מושג.

.חשוב לתת למושג שם שמתאר אותו

המושג יכול להיות ציור, מילה, סדרה חשבונית, מבנה, או

תהליך.

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

סיכום: חשיבה תכנות פונקציונאלי - רקורסיבית

משני בדרך-כלל הגדרה רקורסיבית מורכבתחלקים:

המקרה הבסיסי )הפשוט( ביותר, הנקרא גם תנאיהעצירה.

,המקרה הכללי, הנקרא גם הקריאה הרקורסיביתהמתאר את התופעה )המושג( בעזרת הגדרה

פשוטה יותר של אותה תופעה )מושג(.

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

תכנות פונקציונאלי - פונקציות רקורסיביות

נבנה אלגוריתם רקורסיבי לחישוב סכום

האברים ברשימת מספרים.

.נסחו את הפתרון באופן מילולי

.תרגמו את הפתרון המילולי לפונקציה

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

תכנות פונקציונאלי - פונקציות רקורסיביות

חישוב סכום אברי רשימה

)define (sum_list l((cond

[(empty? l) 0[[(+ (first l) (sum_list (rest l)))]))

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

תכנות פונקציונאלי - פונקציות רקורסיביות

אלגוריתם רקורסיבי לחישוב סכום האברים

הזוגיים ברשימת מספרים.

.נסחו את הפתרון באופן מילולי

.תרגמו את הפתרון המילולי לפונקציה

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

תכנות פונקציונאלי - פונקציות רקורסיביות

סכום האברים הזוגיים ברשימה

)define (sum_even l)

(cond

[(empty? l) 0]

[(even? (first l)) (+ (first l) (sum_even (rest l)))]

[else (sum_even (rest l))]))

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

תכנות פונקציונאלי - פונקציות רקורסיביות

הוצאת איבר מרשימה :דוגמאות

את האיבר השני, ( 40 30 20 10)אם נוציא מהרשימה

.(40 30 10)נקבל את הרשימה

אם נוציא מהרשימה(what a nice day) את האיבר

.(what a day)השלישי, נקבל את הרשימה

:הפונקציה קולטת מספר באופן כללי i -ורשימה, 0 גדול מ

-י.iומחזירה את הרשימה ללא האיבר ה-

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

תכנות פונקציונאלי - פונקציות רקורסיביות

בניה הדרגתית של הפונקציה. נכתוב פונקציהwithout-1 המקבלת רשימה ומחזירה

אותה ללא האיבר הראשון. :למשל(without-1 ‘( 10 20 30 40 )) (40 30 20) תחזיר.

(define (without_1 l)

(rest l))

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

תכנות פונקציונאלי - פונקציות רקורסיביות

נכתוב פונקציהwithout-2 המקבלת רשימה ומחזירה

אותה ללא האיבר השני.

,למשל(without-2 ‘( 10 20 30 40 )) (40 30 10) תחזיר.

(define (without_2 l)

(cons (first l)(without_1 (rest l))))

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

תכנות פונקציונאלי - פונקציות רקורסיביות

האם ניתן להיעזר בפונקציות הקודמות לכתיבת without-3?

(60 50 40 30 20 10)נניח שהרשימה המקורית היא.

נבדוק מה יחזירו הפונקציות הקודמות

(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 )

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

תכנות פונקציונאלי - פונקציות רקורסיביות

כדי להוציא מרשימה את האיבר השלישי שלה, ניתן להחזיר

את האיבר הראשון לרשימה המתקבלת מהוצאת האיבר

השני מהרשימה ללא האיבר הראשון.

(define (without_3 l)

(cons (first l)(without_2 (rest l))))

נשלים את הפונקציה המוציאה מרשימה את האיבר הרביעי

שלה.

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

תכנות פונקציונאלי - פונקציות רקורסיביות

?מה משותף לפונקציות האחרונות

כיצד ניתן להשתמש במשותף לפונקציות הקודמות

?withoutבבניית הפונקציה הכללית

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

תכנות פונקציונאלי - פונקציות רקורסיביות

הפונקציה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)?

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

תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות

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)))]))

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

תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות

הפונקציה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))]))

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

תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות

הניחו כי הכליםfrom, upto.קיימים

- בנו באמצעותם פונקציה חדשה(between L a b) ,

. b עד המקום a מהמקום Lהמחזירה את איברי הרשימה

> (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.איננה רקורסיבית

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

תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות

הפונקציה(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 )

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

תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות

הפונקציה(between L a b ) המחזירה את איברי הרשימה L

:b עד המקום aמהמקום

(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)

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

תכנות פונקציונאלי - פונקציות רקורסיביות, כלים לעיבוד רשימות

השתמשו בכליםfrom -ו upto להגדרת הפונקציה (insert L x n) ,

. L ברשימה n למקום ה- xהמכניסה את האיבר

:דוגמאות

(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 כפונקציה רקורסיבית, ללא שימוש

upto.ו- fromבכלים

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

תכנות פונקציונאלי - פונקציות רקורסיביות

:נושאים נוספים

:מסננות קלטמהן בנייתן

באופן פשוט לבדיקת אופיו של אובייקט מסויםבהמשך - לבדיקת אופיין של רשימות

בדיקות

מודל האנשים הקטנים

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

תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map)

פונקציה המקבלת רשימת מספרים חיוביים ומחזירה

רשימה של שורשי המספרים. (1 25 0 64 100‘)עבור הרשימה

. (1 5 0 8 10)תוחזר הרשימה

פונקציה המקבלת רשימה של רשימות לא ריקות ומחזירה

רשימה של איבריהם הראשונים. עבור((‘my cat( )good morning( )dad and mom))

.(my good dad)תוחזר הרשימה

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

תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map)

פונקציה המקבלת רשימת מספרים חיוביים

ומחזירה רשימה של שורשי המספרים.

(define (sqrt_list l) (cond [(empty? l) l] [else (cons (sqrt (first l)) (sqrt_list (rest l)))]))

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

תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map)

פונקציה המקבלת רשימה של רשימות לא ריקות

ומחזירה רשימה של איבריהם הראשונים.

(define (first_list l)

(cond

[(empty? l) l]

[else (cons (first (first l)) (first_list (rest l)))]))

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

תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map)

הפונקציות הנ"ל מקבלות רשימה )רשימת

קלט( ומחזירות רשימה )רשימת פלט(.

לכל איבר ברשימת הקלט מותאם איבר

ברשימת הפלט.

פונקצית מיפויהתאמה כזו נקראת.

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

תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (map)

.דוגמאות נוספות לפונקציות מיפוי

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

תכנות פונקציונאלי - פונקציות רקורסיביות, מיפוי (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)

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

תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter)

כתבו פונקציה רקורסיבית המקבלת רשימה כלשהי ומחזירהרשימה רק עם המספרים שבה.

.נסחו את הפתרון באופן מילולי

.תרגמו את הפתרון המילולי לפונקציה

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

תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter)

כתבו פונקציה רקורסיבית המקבלת רשימה כלשהי ומחזירהרשימה רק עם המספרים שבה.

)define (only_numbers l)

(cond

[(empty? l ['() (

[(number? (first l))

(cons (first l) (only_numbers (rest l [(((

[else (only_numbers (rest l))]))

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

תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (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 ) ?מה מבצעת הפונקציה.תנו לפונקציה שם משמעותי

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

תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter)

כתבו פונקציה שמקבלת רשימה כלשהי ובונה רשימה חדשה

הרשימות שבה.ללא

(define (not_list l)

(cond

[(empty? l) '()]

[(list? (first l)) (not_list (rest l))]

[else (cons (first l) (not_list (rest l)))]))

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

תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter)

הפונקציות הנ"ל מקבלות רשימה )רשימת קלט( ומחזירות

רשימה )רשימת פלט( שנמצאים בה רק האיברים המקיימים

תנאי מסוים.

פונקצית סינוןפונקציות מסוג זה נקראות .

.הציעו דוגמאות נוספות לפונקציות סינון

כתבו את הפונקציהfilter)?מהם קלטיה(

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

תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (filter)

פונקצית סינון הקולטת את פונקצית המיפוי ורשימה ומבצעת את הסינון.

(define (filter l predicate)

(cond

[(empty? l) '()]

[(predicate (first l))

(cons (first l) (filter (rest l) predicate))]

[else (filter (rest l) predicate)]))

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

תכנות פונקציונאלי - פונקציות רקורסיביות, סינון (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)

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

תכנות פונקציונאלי - פונקציות רקורסיביות, צמצום (reduce)

כתבנו פונקציה הקולטת רשימת מספרים ומחזירה

את סכומם.

:פרדיקטים כתבו פונקציה הקולטת רשימה ומחזירה#t אם כל

אחרת. f#איברי הרשימה הם רשימות ו-

כתבו פונקציה הקולטת רשימת מספרים ומחזירה#t אחרת.f#אם כל איברי הרשימה זוגיים ו-

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

תכנות פונקציונאלי - פונקציות רקורסיביות, צמצום (reduce)

הפונקציות הנ"ל הן פונקציות צמצום היות והן

קולטות רשימה ומחזירות מספר או ערך

בוליאני.

כתבו את הפונקציהreduce. ?מהם קלטיה

?האם ניתן לתפוס את כל המקרים בפונקציה אחת

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

map, filter, reduceתכנות פונקציונאלי -

פונקציות הןfirst order objects

המושג הפשטה

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

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

:תרגיל

רשמו ביטוי הקולט רשימה ומחזיר את מספר

האיברים הגדולים מממוצע המספרים

ברשימה.

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

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

בדומה אין השמה, אין אפשרות לשים ערכים בזיכרון(למתמטיקה(

.פתרון: בעזרת פונקציות

:פתרון התרגיל באופן מסורתי .חישוב הממוצע והשמתו במשתנה .ספירת מספר האיברים הגדולים מהממוצע

.בתכנות פונקציונאלי: הרכבת פונקציות

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

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

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

)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)]))

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

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

רשמו ביטוי שהקלט שלו הוא רשימה המחזיר את מספר

האיברים הגדולים מממוצע איברי הרשימה.

הגדרת פונקצית-על על-מנת לשמור את הממוצע של

.הרשימה המקורית

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

תכנות פונקציונאלי, פונקציות רקורסיביות, סיכום

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

שונים.

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

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

העצירה..אם אין שינוי בפרמטר המתאים, הפונקציה )התהליך( לא תעצור

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

תכנות פונקציונאלי, פונקציות רקורסיביות, סיכום

סוגי רקורסיה: רקורסית קצה(tail recursion) יוצרת תהליך חישובי -

איטרטיבי )לולאה(. .רקורסיה אמיתית )מלאה( - יוצרת תהליך רקורסיבי מלא רקורסיה לינארית )חד-ממדית( מכילה קריאה

רקורסיבית יחידה. רקורסיה מורכבת )רב-ממדית( מכילה יותר מקריאה

רקורסיבית אחת.

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

תכנות פונקציונאליפונקציות והרכבתםפונקציות הן איבר מסדר ראשוןאין השמה

: רעיונות נלווים של מדעי המחשבמסננת קלטבדיקותרקורסיהמבני נתונים

מבנה בסיסי - רשימהבהמשך נבנה ממבנה זה מבנים מורכבים יותר

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

תכנות פונקציונאלי – דיון

באיזה מובן סוג התכנות שחווינו מהווהפרדיגמה תכנותית?