240 likes | 436 Vues
×ª×›× ×•×ª ×¤×•× ×§×¦×™×•× ×לי -תרגול III. רקורסיה. סוגי רקורסיה. רקורסית קצה ( tail recursion ) - יוצרת תהליך חישובי ×יטרטיבי (לול××”). רקורסיה ×מיתית (מל××”) - יוצרת תהליך רקורסיבי מל×. רקורסיה ×œ×™× ×רית (חד-ממדית) - מכילה קרי××” רקורסיבית יחידה.
E N D
תכנות פונקציונאלי -תרגול III רקורסיה
סוגי רקורסיה • רקורסית קצה (tail recursion) - יוצרת תהליך חישובי איטרטיבי (לולאה). • רקורסיה אמיתית (מלאה) - יוצרת תהליך רקורסיבי מלא. • רקורסיה לינארית (חד-ממדית) - מכילה קריאה רקורסיבית יחידה. • רקורסיה מורכבת (רב-ממדית) - מכילה יותר מקריאה רקורסיבית אחת.
פונקציות מהסוג: רשימה איבר
תרגיל 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))))
תרגיל 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)) ))
תרגיל 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)) ))
תרגיל 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)) ) ))
תרגיל 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)
תרגיל 4 א. כתבו פונקציה בוליאנית המקבלת רשימה ובודקת אם קיים ברשימה איבר שהוא מספר. ( define (exist-num? L ) (cond ( (empty? L) #f) ( (number? (first L) #t) (else (exist-num? (rest L))))
תרגיל 4 ב. כתבו פונקציה בוליאנית המקבלת רשימה ובודקת אם קיים ברשימה איבר שהוא רשימה. ( define (exist-list? L ) (cond ( (empty? L) #f) ( (list? (first L) #t) (else (exist-list? (rest L))))
תרגיל 4 ג. כתבו פונקציה המקבלת רשימה ופונקציה בוליאנית (פרדיקט) ומחזירה "אמת" אם קיים איבר אחד לפחות המקיים תנאי זה ו"שקר" – אחרת. ( define (cond-hold L f ) (cond ( (empty? L) #f) ( (f (first L) #t) (else (cond-hold (rest L) f))))
תרגיל 5 כתבו פונקציה המקבלת רשימה ופונקציה בוליאנית ובודקת אם כל איברי הרשימה המקיימים תנאי זה. ( define (all-cond-hold L predicate ) (cond ( (empty? L) #t) ( (predicate (first L)) (all-cond-hold (rest L) predicate) ) (else #f)))
תרגיל 6 כתבו פונקציה המקבלת רשימת מספרים ומחזירה את מספר האיברים הקטנים מממוצע כל האיברים ברשימה. ( 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)) ) )) ( define (avg L ) ( / (sum-list L) (length L)))
תרגיל 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)))) )
פונקציות מהסוג: רשימה רשימה
תרגיל 1 כתבו פונקציה המקבלת רשימת רשימות ומחזירה את רשימת האורכים של הרשימות ברשימת הקלט. (define (len-lists L) (cond ((empty? L) '()) (else (cons (length (first L)) (len-lists (rest L))))))
תרגיל 2 כתבו פונקציה המקבלת רשימת רשימות מספרים ומחזירה את רשימת הממוצעים של רשימות הרשימה המקורית. (define (avg-list L) (cond ((empty? L) '()) (else (cons (avg (first L)) (avg-list (rest L)))) ))
תרגיל 3 כתבו פונקציה המקבלת רשימה ופונקצית פעולה אונרית ומחזירה רשימה כך שעל כל איבר ברשימת הקלט מופעלת פעולה הנתונה. (define (map_list L func) (cond ((empty? L) '()) (else (cons (func (first L)) (map_list (rest L) func)))))
תרגיל 4 כתבו פונקציה המקבלת רשימה ומחזירה רשימת כל האיברים הראשונים מתוכה. (define (prime-list L) (cond ([empty? L] '()) ([prime? (first L)] (cons (first L) (prime-list (rest L)))) (else (prime-list (rest L))) ))
תרגיל 5 כתבו פונקציה המקבלת רשימה ומחזירה רשימה שבה כל האטומים המופיעים ברשימה קלט. (define (atom-list L) (cond ([empty? L] '()) ([atom? (first L)] (cons (first L) (atom-list (rest L)))) (else (atom-list (rest L))) ))
תרגיל 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) ))