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

Slides:



Advertisements
מצגות קשורות
מבוא לביואינפורמטיקה יואלה יריב רוברט בצאם 17.june.2002.
Advertisements

תכנות בשפת C תרגול 11 - קבצים.
תוכנה 1 בשפת Java שיעור מספר 5: עצמים
הרצאה 02 סוגי משתנים קרן כליף.
ניווט רובוט מסוג ROOMBA במרחב ממופה
ייצוגים שונים של פונקציה
מחלקת הדרכה תשע"ח אמינות ויושרה – המושג אמת – חלק א מטרות הפעילות:
מבוא לתכנות ב-JAVA מעבדה 1
תוכנה 1 תרגול 13 – סיכום.
תרגול 11: רקורסיה ופיתוח טלסקופי
תרגול 1: סביבת העבודה ומבוא ל-Java
תרגול 11 מלכודות בניית ה-Debugger
נערך ע"י אריק הוד, הגימנסיה העברית הרצליה
מיונים (SORTS) שמושים ביישומים רבים
תוכנה 1 תרגול 12 – סיכום.
מבוא למדעי המחשב מ' - תירגול 9
תירגול 10: מבנים (structs) וקבצים
Marina Kogan Sadetsky –
רמי כהן, מדעי המחשב, הטכניוןכל הזכויות שמורות ©
הרצאה 3: משפטים, תנאים ולולאות
רקורסיה ופתרונות רקורסיביים
מבוא למדעי המחשב הרצאה מספר 12: רקורסיה
תכנות בשפת C תרגול 11 רשימות מקושרות מבנים
תרגול Introduction to C - Fall Amir Menczel.
פעולות אריתמטיות קרן כליף.
Computer Programming תרגול 1 Summer 2016
תירגול 11: מיונים וחיפוש בינארי
נערך ע"י אריק הוד הגימנסיה העברית הרצליה
רקורסיה ופתרונות רקורסיביים
תכנות בשפת C תרגול 8 רקורסיה
Engineering Programming A
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מבוא למדעי המחשב הרצאה 9: רקורסיה
תרגול 6: פונקציות, סוגי משתנים, top-down design
תירגול 2: מבוא לתיכנות ב-C
Carry Save Adder (CSA).
תוכנה 1 בשפת Java שיעור מספר 5: מנשקים תחילה
© האוניברסיטה העברית בירושלים, 2008
כל הזכויות שמורות לגבריאל אנקרי © 2017
מבוא לתכנות מונחה עצמים Object Oriented Programming
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הרצאה 10: אלגוריתמי מיון רקורסיביים Merge sort ו-Quick sort
פרופ' מוטי בן-ארי המחלקה להוראת המדעים מכון ויצמן למדע
מבוא לתכנות למערכות מידע
אלגוריתמי מיון רקורסיביים
המשך תכנות מונחה עצמים תרגול מס' 9.
כל הזכויות שמורות לגבריאל אנקרי © 2017
תרגול 13 : חזרה נכתב על-ידי לימור ליבוביץ נערך ע"י ישראל גוטר
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
תוכנה 1 תרגול - Generics.
שימוש בעצם ממחלקה אחרת כמאפיין במחלקה הנוכחית
מבוא לתכנות ב- JAVA מעבדה 4
מבנה כללי של היררכיית הקבצים עבור המסלול /A/B.txt
מבוא למדעי המחשב סמסטר ב' – 2008 מרצה: יעל סיגל מתרגל: ענבל בודובסקי.
Introduction to Programming in C
תרגול 12: backtracking.
מצביעים Pointers – המשך...
תוכנה 1 - תרגול תרגיל – חברת הייטק בית הספר למדעי המחשב
תרגול מס' 7: Memoization Quicksort תרגילים מתקדמים ברקורסיה
עקרונות תכנות מונחה עצמים תרגול 9:C++ - תרגילים
תוכנה 1 בשפת Java שיעור מספר 11: חידושים ב Java 8
רקורסיה ופתרונות רקורסיביים
Java Programming רשימות מקושרות - המשך
הפונקציה מחזירה את מספר התווים במחרוזת נתונה.
Engineering Programming A
רשימות מקושרות עבודה עם קבצים דוגמה
תמליל מצגת:

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

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

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

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

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

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

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

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

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

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

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים דוגמה נוספת: עצרת 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 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים חישוב 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 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים 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 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

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

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

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

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

מחרוזת בת תו אחד או מחרוזת בעלת 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 תווים © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

מעקבים 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 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

פתרון 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 בדיקה אחרי הזימון הרקורסיבי: רקורסיית "הלוך חזור" © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

מעקב 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 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

אינדקס ההתחלה והסוף של הטווח פתרון 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; } אינדקס ההתחלה והסוף של הטווח תנאי עצירה מתחילת המערך עד אמצעו מאמצע המערך עד סופו © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים מעקב 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] © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

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

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

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

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