תכנות פונקציונאלי -תרגול iii

23
ללללל- ללללל לללללללללללIII ללללללל

Upload: bono

Post on 19-Jan-2016

61 views

Category:

Documents


0 download

DESCRIPTION

תכנות פונקציונאלי -תרגול III. רקורסיה. סוגי רקורסיה. רקורסית קצה ( tail recursion ) - יוצרת תהליך חישובי איטרטיבי (לולאה). רקורסיה אמיתית (מלאה) - יוצרת תהליך רקורסיבי מלא. רקורסיה לינארית (חד-ממדית) - מכילה קריאה רקורסיבית יחידה. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: תכנות פונקציונאלי -תרגול   III

III תכנות פונקציונאלי -תרגול

רקורסיה

Page 2: תכנות פונקציונאלי -תרגול   III

סוגי רקורסיה  

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

איטרטיבי )לולאה(.

)יוצרת תהליך רקורסיבי מלא. רקורסיה אמיתית )מלאה -

)מכילה קריאה רקורסיה לינארית )חד-ממדית -

רקורסיבית יחידה.

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

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

Page 3: תכנות פונקציונאלי -תרגול   III

פונקציות מהסוג:

איבררשימה

Page 4: תכנות פונקציונאלי -תרגול   III

1תרגיל

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

ומחשבת את סכום המספרים החד-ספרתיים שברשימה.

( define (sum-one-dig L)

(cond

( (empty? L) 0)

( (< 10 (first L)) ( + (first L) (sum-one-dig (rest L)))

(else ((sum-one-dig (rest L))))

Page 5: תכנות פונקציונאלי -תרגול   III

1תרגיל

ב. הרחיבו את הפונקציה מסעיף א', כך שתקבל גם

רשימות לא שטוחות.

תזכורת: רשימה לא שטוחה היא רשימה המכילה )גם( רשימות.

( define (sum-one-dig L)

(cond

( (empty? L) 0)

( (list? (first L))

(+ (sum-one-dig (first L)) (sum-one-dig (rest L) ) ))

( (< 10 (first L)) (+ (first L) (sum-one-dig (rest L)))

(else (sum-one-dig (rest L)) ))

Page 6: תכנות פונקציונאלי -תרגול   III

2תרגיל

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

ומחזירה את מספר האיברים הגדולים ממספר זה.

( define (greater-than L x)

(cond

( [empty? L] 0)

( [> (first L) x ] (add1 (greater-than (rest L) x) ))

(else (greater-than (rest L) x)) ))

Page 7: תכנות פונקציונאלי -תרגול   III

2תרגיל

ב. הרחיבו את הפונקציה מסעיף א' כך שתקבל גם

define (greater-than L x) )רשימות לא שטוחות.

(cond

( (empty? L) 0)

((list? (first L)

(+ (greater-than (first L) x) (greater-than (rest L) x)) )

( (> (first L) x ) (add1 (greater-than (rest L) x)) )

(else (greater-than (rest L) x)) ) ))

Page 8: תכנות פונקציונאלי -תרגול   III

3תרגיל

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

המקסימום מבין איברי הרשימה.

. הרחיבו את הפונקציה מסעיף א' כך שתקבל רשימות לא ב

define (max-L L) )שטוחות.

(max-help L (first L) )

(define (max-help L max)

(cond

( (empty? L) max)

(( > (first L) max ) (max-help (rest L) (first L)))

( else max-help (rest L) max)

Page 9: תכנות פונקציונאלי -תרגול   III

4תרגיל

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

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

( define (exist-num? L )

(cond

( (empty? L) #f)

( (number? (first L) #t)

(else (exist-num? (rest L))))

Page 10: תכנות פונקציונאלי -תרגול   III

4תרגיל

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

ובודקת אם קיים ברשימה איבר שהוא רשימה.

( define (exist-list? L )

(cond

( (empty? L) #f)

( (list? (first L) #t)

(else (exist-list? (rest L))))

Page 11: תכנות פונקציונאלי -תרגול   III

4תרגיל

ג. כתבו פונקציה המקבלת רשימה ופונקציה

בוליאנית )פרדיקט( ומחזירה "אמת" אם קיים איבר

אחד לפחות המקיים תנאי זה ו"שקר" – אחרת.( define (cond-hold L f )

(cond

( (empty? L) #f)

( (f (first L) #t)

(else (cond-hold (rest L) f))))

Page 12: תכנות פונקציונאלי -תרגול   III

5תרגיל

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

ובודקת אם כל איברי הרשימה המקיימים תנאי זה.

( define (all-cond-hold L predicate )

(cond

( (empty? L) #t)

( (predicate (first L)) (all-cond-hold (rest L) predicate) )

(else #f)))

Page 13: תכנות פונקציונאלי -תרגול   III

6תרגיל

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

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

( define (avg L )

( / (sum-list L) (length L)))

( define (sum-list L )

( cond

(( empty? L) 0)

(else (+ (first L)

(sum-list (rest L)) ) ))

( define (gt-avg L )

( cond

(( empty? L) 0)

((> (first L) (avg L))

(add1 (gt-avg (rest L))))

(else (gt-avg (rest L)) ) ))

Page 14: תכנות פונקציונאלי -תרגול   III

7תרגיל

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

מקומם לערך זהה שערכם ברשימה האיברים מספר

ברשימה.                ( define (place_eq_val L )

( help L 0))

(define (help L pl)

(cond

((empty? L) 0)

((= pl (first L)) (add1 (help (rest L) (add1 pl))))

(else (help (rest L) (add1 pl)))) )

Page 15: תכנות פונקציונאלי -תרגול   III

פונקציות מהסוג:

רשימהרשימה

Page 16: תכנות פונקציונאלי -תרגול   III

פונקציות מיפוי

Page 17: תכנות פונקציונאלי -תרגול   III

1תרגיל

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

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

(define (len-lists L)

(cond

((empty? L) '())

(else (cons (length (first L)) (len-lists (rest L))))))

Page 18: תכנות פונקציונאלי -תרגול   III

2תרגיל

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

ומחזירה את רשימת הממוצעים של רשימות הרשימה

define (avg-list L))המקורית.

(cond

((empty? L) '())

(else (cons (avg (first L)) (avg-list (rest L)))) ))

Page 19: תכנות פונקציונאלי -תרגול   III

3תרגיל

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

ומחזירה רשימה כך שעל כל איבר ברשימת הקלט

מופעלת פעולה הנתונה.

(define (map_list L func)

(cond

((empty? L) '())

(else (cons (func (first L)) (map_list (rest L) func)))))

Page 20: תכנות פונקציונאלי -תרגול   III

פונקציות סינון

Page 21: תכנות פונקציונאלי -תרגול   III

4תרגיל

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

האיברים הראשונים מתוכה.

(define (prime-list L)

(cond

([empty? L] '())

([prime? (first L)] (cons (first L) (prime-list (rest L))))

(else (prime-list (rest L))) ))

Page 22: תכנות פונקציונאלי -תרגול   III

5תרגיל

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

האטומים המופיעים ברשימה קלט.

(define (atom-list L)

(cond

([empty? L] '())

([atom? (first L)] (cons (first L) (atom-list (rest L))))

(else (atom-list (rest L))) ))

Page 23: תכנות פונקציונאלי -תרגול   III

6תרגיל

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

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

זה. (define (filter-list L func)

(cond

([empty? L] '())

([func (first L)] (cons (first L) (filter-list (rest L) func)))

(else (filter-list (rest L) func) ))