מבוא למדעי המחשב 2020 תרגול 6 רקורסיה
ראינו בהרצאה רקורסיה זיווג מושלם ספיידרמן Gcd רקורסיבי מגדלי הנוי ועוד..
בתרגול היום רקורסיה חישוב חזקה פלינדרום הדפסת יצוג בינארי הדפסת כל תתי הקבוצות Subset Sum
רקורסיה קריאה של פונקציה לעצמה באופן ישיר או עקיף
רקורסיה שלושת הכללים לבניית שיטה רקורסיבית: תנאי עצירה שניתן לענות עליו ללא קריאה רקורסיבית. )תנאי בסיס( קריאה רקורסיבית עם קלט הקרוב יותר לתנאי העצירה )הקטנת הבעיה(. שימוש בתוצאת הקריאה הרקורסיבית לחישוב התוצאה המוחזרת )השלמת הפתרון(..1.2.3
חישוב חזקה b a נרצה לכתוב פונקציה ומחשבת את a b רקורסיבית המקבלת שני מספרים טבעיים ו public static int exp(int a, int b) { int result; if (b == 0) { result = 1; } else { result = a * exp(a, b - 1); } return result; }
מצאו את יוצא הדופן רק פושטק עלוב בולע קטשופ קר נטול גלוטן aibohphobia רבע הלילה עבר Was it a car or a cat I saw ארון קיר היה ריק נורא רקורסיה כי מי שמאמין לא מפחד מי אמר שיש רמאים.1.2.3.4.5.6.7.8
פלינדרום נרצה לכתוב פונקציה רקורסיבית אם המחרוזת היא פלינדרום ו הפרמטר אינו.null המקבלת,False - מחרוזת, ומחזירה True אחרת. ניתן להניח כי public static boolean ispalindrome(string s) { boolean ans = false; if (s.length() == 0 s.length() == 1) { ans = true; } else if (s.charat(0) == s.charat(s.length() - 1)) { ans = ispalindrome(s.substring(1, s.length() - 1)); } return ans; }
הדפסת יצוג בינארי של מספר שלם חיובי,n כתבו פונקציה רקורסיבית (n printbinary(int הבינארי שלו מבלי להשתמש במחרוזות. אשר בהינתן שלם חיובי, הייצוג את מדפיסה public static void printbinary(int n){ if(n >= 2) // print the first digits (most significant bits) printbinary(n/2); // print lsb (last digit) System.out.print(n%2); }
הדפסת תתי קבוצות בהינתן מחרוזת אשר תוויה )שונים זה מזה( מייצגים אברי קבוצה, נרצה להדפיס את כל תתי הקבוצות שלה. דוגמה: תתי הקבוצות של התווים במחרוזת abc הינן: c b bc a ac ab abc נפתור זאת באמצעות רקורסיה //print all subsets of s public static void printallsubsets(string s)
דוגמה: abc s = no abc, yes no bc, yes no bc, a yes no c, yes no c, b yes no c, a yes no c, ab yes, Output:, c Output: c, b Output: b, bc Output: bc, a Output: a, ac Output: ac, ab Output: ab, abc Output: abc
רעיון הרקורסיה נתונה מחרוזת באורך n מחצית תתי הקבוצות שלה מכילות את התו הראשון ומחציתן לא. בכל קריאה נחשב את תתי הקבוצות שלא מכילות את התו הראשון תתי הקבוצות שמכילות את התו הראשון וגם את כאשר התו הראשון נכלל בפתרון "נצבור" )נזכור( אותו הפתרון טריוויאלי עבור המחרוזת הריקה )תנאי עצירה( דוגמא עבור :"abc"
//print all subsets of s concatenated with acc public static void printallsubsets(string s, String acc){ } if (s.equals("")){ System.out.println(acc); { else{ } //print all subsets of s public static void printallsubsets(string s){ printallsubsets(s, ""); { האלגוריתם קריאות רקורסיביות תנאי עצירה printallsubsets(s.substring(1), acc + s.charat(0));//take first char printallsubsets(s.substring(1), acc); //skip the first char
דוגמאת ריצה: abc s = Output: abc ab abc, no yes bc, a no yes c, ab yes, ab, abc printallsubsets name type value printallsubsets s String name type value acc String s printallsubsets String acc name String type value s printallsubsets String acc name String type value printallsubsets s String name type acc value String s String acc String זכרון משותף abc bc a c ab ab abc
בהינתן מערך משקולות אי-שליליים weights ומשקל נוסף,Sum נרצה לבדוק האם קיימת תת-קבוצה של משקולות אשר סכומה הוא.Sum.15 Subset Sum דוגמא: קלט: = 12 Sum weights = {1,7,9,3}, פלט:,true כיוון שסכום המשקולות 9,3 הוא 12. דוגמא נוספת: קלט: = 15 Sum weights = {1,7,9,3}, פלט:,false כיוון שלא קיים סכום משקולות השווה //check if the sum can be taken from weights. public static boolean subsetsum(int[] weights, int sum)
הרעיון של הרקורסיה i=0 i=1 take 1 {1, 9,7}, 7 { 1,9,7}, 8 i=2 skip 9 i=2 {1,9, 7 }, -2 {1,9, 7 }, 7 return false skip 7 return true {1,9,7}, 0 {1,9,7}, 7 i=3 i=3 נחליט בכל שלב את האיבר ה- i. נחזיר ליעד i האם לסכום true כאשר הגענו נחזיר false כאשר עברנו את היעד או כשנגיע אל סוף המערך. דוגמא: weights = {1,9,7}, Sum = 8 return false
//check if the sum can be taken from weights, starting at index i. public static boolean subsetsum(int[] weights, int sum, int i){ boolean ans = false; { if(sum == 0) ans = true; return ans; האלגוריתם קריאות רקורסיביות תנאי עצירה else if (sum < 0 i >= weights.length) ans = false; else ans = subsetsum(weights, sum - weights[i], i+1) subsetsum(weights, sum, i+1); //check if the sum can be taken from weights. public static boolean subsetsum(int[] weights, int sum){ return subsetsum(weights, sum, 0); }
Subset Sum כמה פתרונות קיימים? כעת נרצה לדעת כמה פתרונות קיימים. כלומר, עבור בעיית ה- Sum Subset הנתונה נרצה לדעת כמה אפשרויות קיימות להרכבת הסכום.sum דוגמא: נתון 10 = Sum weights = {1,7,9,3}, = 10 7+3 וכן = 10.1+9 לכן הפונקציה תחזיר.2 //count the different options to add elements from weights that sums to sum. public static int subsetsumcount(int[] weights, int sum)
קוד //count the different options to add elements from weights starting at index i that sums to sum. public static int subsetsumcount(int[] weights, int sum, int i){ int ans = 0; { if(sum == 0) ans = 1; else if (sum < 0 i >= weights.length) ans = 0; else ans = subsetsumcount(weights, sum - weights[i], i+1) return ans; + subsetsumcount(weights, sum, i+1); קריאות רקורסיביות תנאי עצירה //count the different options to add elements from weights that sums to sum. public static int subsetsumcount(int[] weights, int sum){ return subsetsumcount(weights, sum, 0); }
שימוש באקליפס הכרות ושימוש בסביבת העבודה של אקליפס
בניגוד לכלים שראינו עד עכשיו סביבת פיתוח היא תוכנה המנסה לאגד מספר כלים תחת ממשק אחיד. יתרונות של סביבת פיתוח: המטרה של סביבת פיתוח היא להפוך את הפיתוח למהיר יותר קל יותר. הכלים והתכונות שלה אמורים לעזור לך לארגן משאבים, טעויות, ולספק קיצורי דרך. עוזרת בניהול מידע בפרויקטים גדולים. השלמה אוטומטית של קוד. למנוע
באתר הקורס קיים מדריך להורדה והתקנה של,Eclipse תחת הלשונית.Useful links
על מנת ליצור פרוייקט נבחר בתפריט.New Java Project ובו נבחר,,File נבחר שם עבור הפרויקט ונלחץ על finish
כעת ניצור קובץ מחלקה, נלחץ על הכפתור הימני בעכבר על שם הפרויקט שיצרנו, בתפריט נבחר ב- new, ולאחר מכן נבחר ב- class.
בקובץ המחלקה שיצרנו, הדרוש. כדי להפעיל את התכנית יש צורך בפונקציה main נכתוב את הקוד public static void main(string[] args) להרצת התכנית שכתבנו, נשמור את השינויים שעשינו ונלחץ על כפתור ה-.run
סיכום ומשימות.6/12/19 תרגלנו: רקורסיה תגבור השבוע על רקורסיה. משימות: עבודת בית מס' 2 להגשה עד ה- תרגילון.6