המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

מצגות קשורות


מצגת בנושא: "© המרכז להוראת המדעים האוניברסיטה העברית בירושלים"— תמליל מצגת:

1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פרק 4 רקורסיה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

2 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
דוגמת השוקולד רוצים לחלק חפיסת שוקולד של 32 קוביות בין 32 תלמידים. כל חלוקה לוקחת שנייה אחת. השוקולד נמס תוך 6 שניות. כיצד אפשר לבצע את חלוקת החפיסה כך שהשוקולד לא יִמס? © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

3 תוך כמה שניות תתבצע החלוקה ?
פתרון לשתף את כל הכיתה בחלוקה: המורה תחלק את השוקולד ל-2 ותמסור לשני תלמידים. כל אחד מהתלמידים יחלק את החתיכה שקיבל ל-2 וימסור לשני תלמידים. התהליך יסתיים כאשר כל תלמיד יחזיק קובייה אחת. תוך כמה שניות תתבצע החלוקה ? © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

5 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מושגים ברקורסיה מקרה מורכב מקרה בסיסי תנאי עצירה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

6 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הדפסת מספר במהופך ברצוננו להדפיס מספר במהופך ללא שימוש במערך או במחסנית (או בכל טיפוס נתונים נוסף). © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

8 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
דוגמה: הדפסה במהופך של 1849 הדפס במהופך את 1849 הדפסה : 9 הדפס במהופך את 184 הדפסה: 4 הדפס במהופך את 18 הדפסה : 8 הדפס במהופך את 1 הדפסה : 1 מקרה מורכב מקרה מורכב מקרה מורכב מקרה בסיסי © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

9 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
האלגוריתם הדפס-במהופך (n) אם n<10, הדפס את n אחרת: הדפס את n%10(השארית של חלוקת n ב-10( זמֵן את הדפס-במהופך (n/10) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

10 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פעולה public static void reverse (int n) { if (n<10) System.out.println (n); else System.out.print (n%10); reverse (n/10); } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

11 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
דוגמה נוספת: עצרת n! 1! = 1 2! = 1 * 2 = 2 3! = 1 * 2 * 3 = 6 4! = 1 * 2 * 3 * 4 = 24 5! = 1 * 2 * 3 * 4 * 5 = 120 ... n! = 1 * 2 * 3 *…* (n-1) * n לפי ההגדרה המתמטית: 0! = 1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

12 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
בעיית העצרת שימו לב: n! = (n-1)! * n הגדרה רקורסיבית: אם n = 0 (המקרה הבסיסי), ערך העצרת הוא 1 אם n > 0 (המקרה המורכב), ערך העצרת הוא המכפלה: n * (n-1)! © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

13 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
אלגוריתם רקורסיבי חשב-עצרת (n) אם n = 0, החזר 1 אחרת, החזר את המכפלה של n בתוצאה המוחזרת מזימון חשב-עצרת (n-1) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

14 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
חישוב 4! factorial (4): 4 * factorial (3) factorial (3): 3 * factorial (2) factorial (2): 2 * factorial (1) factorial (1): 1 * factorial (0) factorial (0): return 1 6 return 24 2 return 6 1 return 2 1 return 1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

15 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מספרי פִיבּוֹנָצִ'י הסדרה: הגדרה רקורסיבית: מספר פיבונצ'י (k): אם k = 1 , הערך הוא 0 אם k = 2 , הערך הוא 1 אחרת, הערך הוא מספר פיבונצ'י (k - 1) + מספר פיבונצ'י (k - 2) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

16 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הפעולה public static int fibonacci (int k) { if (k == 1) return 0; if (k == 2) return 1; return (fibonacci (k-1) + fibonacci (k-2)); } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

17 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
fibonacci (4) X = 2 fibonacci (4) אם k=1... אם k=2... אחרת: החזר + 1 1 fibonacci (3) fibonacci (2) אם k=1... אםk=2 החזר 1 אם k=1... אם k=2... אחרת: החזר + 1 fibonacci (2) fibonacci (1) אם k=1... אם k=2 החזר 1 אם k=1 החזר 0 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

18 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
סוגי רקורסיה רקורסיית זנב רקורסיית "הלוך חזור" רקורסיה כפולה רקורסיה הדדית להכניס הגדרות © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

19 רקורסיה על טיפוסי נתונים שונים
רקורסיה על מחרוזות רקורסיה על מערכים © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

22 פעולות מתוך ה- API של המחלקה String
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

23 משימה כתבו את הפעולה: הבודקת אם מחרוזת נתונה היא פלינדרום.
public static boolean palindrome (String str) הבודקת אם מחרוזת נתונה היא פלינדרום. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

24 מחרוזת בת תו אחד או מחרוזת בעלת 0 תווים
הפעולה public static boolean palindrome (String str) { if (str.length() <= 1) return true; if (str.charAt (0) != str.charAt (str.length()-1)) return false; return palindrome (str.substring(1, str.length()-1)); } מחרוזת בת תו אחד או מחרוזת בעלת 0 תווים © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

25 מעקבים palindrome ("ABCDA") => return false
palindrome ("ABCDA") => palindrome ("BCD") palindrome ("BCD") => return false palindrome ("ABCBA") => return palindrom ("BCB") palindrome ("ABCBA") => return true palindrome ("BCB") => return true palindrome ("BCB") => return palindrom ("C") palindrome ("C") => return true © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

28 פתרון 1 public static int findMax (int[] arr, int begin) {
if (begin == arr.length-1) return arr[begin]; else int temp = findMax (arr, begin+1); if (arr[begin] > temp) return temp; } תנאי עצירה: אורך הקטע הנוכחי במערך הוא 1 האינדקס מתקדם ב-1 בדיקה אחרי הזימון הרקורסיבי: רקורסיית "הלוך חזור" © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

29 מעקב temp = 8; arr[5] = 5, 5 !> 8, return 8
findMax ({4, 6, 9, 7, 1, 5, 8}, 0): temp = findMax ({4, 6, 9, 7, 1, 5, 8}, 1); … findMax ({4, 6, 9, 7, 1, 5, 8}, 1): temp = findMax ({4, 6, 9, 7, 1, 5, 8}, 2); … findMax ({4, 6, 9, 7, 1, 5, 8}, 2): temp = findMax ({4, 6, 9, 7, 1, 5, 8}, 3); … findMax ({4, 6, 9, 7, 1, 5, 8}, 3): temp = findMax ({4, 6, 9, 7, 1, 5, 8}, 4); … findMax ({4, 6, 9, 7, 1, 5, 8}, 4): temp = findMax ({4, 6, 9, 7, 1, 5, 8}, 5); … findMax ({4, 6, 9, 7, 1, 5, 8}, 5): temp = findMax ({4, 6, 9, 7, 1, 5, 8}, 6); … findMax ({4, 6, 9, 7, 1, 5, 8}, 6) => return arr[6] = 8 temp = 9, arr[0] = 4, 4 !> 9, return 9 temp = 9; arr[1] = 6, 9 ! > 8, return 9 temp = 8; arr[2] = 9,9 > 8, return 9 temp = 8; arr[3] = 7, 7 !> 8, return 8 temp = 8; arr[4] = 1, 1 !> 8, return 8 temp = 8; arr[5] = 5, 5 !> 8, return 8 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

30 אינדקס ההתחלה והסוף של הטווח
פתרון 2 public static int findMax (int[] arr, int begin, int end) { if (begin == end) return arr[begin]; else int middle = (begin + end) / 2; int max1 = findMax (arr, begin, middle); int max2 = findMax (arr, middle+1, end); if (max1 > max2) return max1; return max2; } אינדקס ההתחלה והסוף של הטווח תנאי עצירה מתחילת המערך עד אמצעו מאמצע המערך עד סופו © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

31 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מעקב 9 findMax ({9, 6, 4}, 0, 4) אם begin == end ... אחרת: מצא מקסימום בכל מחצית מערך החזר מקסימום בין שתי המחציות... findMax ({9, 6, 4}, 0, 1) אם begin == end... אחרת: מצא מקסימום בכל מחצית מערך החזר מקסימום בין שתי המחציות... 6 findMax ({9, 6, 4}, 2 ,2 ) אם begin == end return arr[begin] 9 4 6 findMax ({9, 6, 4}, 0, 0) אם begin == end return arr[begin] findMax ({9, 6, 4}, 1, 1) אם begin == end return arr[begin] © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

32 האלגוריתם של אוֹקְלִידֵס
אם מספר מחלק שני מספרים, אזי הוא מחלק גם את השארית של חלוקת הגדול שביניהם במשנהו. די למצוא את המחלק המשותף המקסימלי של הקטן מהמספרים, ושל שארית חלוקת הגדול בקטן, אם שארית זו אינה 0. אם השארית היא 0, אזי הקטן שבהם הוא המחלק המשותף המקסימלי. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

33 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
האלגוריתם של אוקלידס public static int euclidGcd (int j, int k) { if (k == 0) return j; else return euclidGcd (k, j%k); } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

34 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מעקב © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

35 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פעולות עזר רקורסיביות פעולה שראינו: public static int findMax (int[] arr, int begin, int end) היינו רוצים אפשרות לזמן את הפעולה ללא האינדקסים: public static int findMax (int[] arr) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

36 זימון פעולת עזר רקורסיבית
פעולות עזר רקורסיביות public static int findMax (int[] arr) } return findMaxHelp (arr, 0, arr.length-1); private static int findMaxHelp (int[] arr, int begin, int end) { ... פעולה ללא האינדקסים זימון פעולת עזר רקורסיבית הפעולה שראינו קודם © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

37 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
סוף © המרכז להוראת המדעים האוניברסיטה העברית בירושלים


הורד את "ppt "© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

מצגות קשורות


מודעות Google