1 / 20

תכנות ב JAVA תרגול 7 רקורסיה 26.3.2013

תכנות ב JAVA תרגול 7 רקורסיה 26.3.2013. רקורסיה. הגדרה : המונח רקורסיה (recursion) מתאר מצב שבו פונקציה קוראת לעצמה באופן ישיר או באופן עקיף.

Download Presentation

תכנות ב JAVA תרגול 7 רקורסיה 26.3.2013

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. תכנותבJAVA תרגול 7 רקורסיה 26.3.2013

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

  3. דוגמא 1: חילוק רקורסיבי public static int divide(int a, int b) { if(b == 0) return 0; else if(a < b) return 0; else if(b == 1) return a; else returnadd(1, divide(sub(a,b),b)); } 2 add(1, divide(sub(a,b),b)); add(1, 1); =2 1 add(1, divide(sub(a,b),b)); add(1, 0); =1 0

  4. דוגמא 1: חילוק רקורסיבי public static int divide(int a, int b) { if(b == 0) return 0; else if(a < b) return 0; else if(b == 1) return a; else returnadd(1, divide(sub(a,b),b)); } 2 add(1, divide(sub(a,b),b)); add(1, 1); =2 1 add(1, divide(sub(a,b),b)); add(1, 0); =1 0

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

  6. תרגיל 1 - פתרון פתרון 1 עם סוכם: • publicstaticintsumDigitWithSum(int n){ • returnsumDigit(Math.abs(n), 0); • { • publicstaticintsumDigit(intnum, int sum) { • if (num == 0) • returnsum; • returnsumDigit(num/10, sum + (num%10)); • { פתרון 2 ללא סוכם: • publicstaticintsumDigit(int n){ • if (n == 0) • return0; • returnsumDigit(n/10) + (n %10); • {

  7. תרגיל 2 עקבו אחרי קטע הקוד הבא ונסו להבין מה התוכנית עושה עבור כל מספר תלת-ספרתי • publicstaticint what(int n) • } • int k; • if (n<10) • returnn; • else • } • k=what((n/100)*10+n%10); • returnk*10+(n % 100)/10; • { • {

  8. תרגיל 3 עקבו אחרי קטע הקוד הבא ונסו להבין מה התוכנית עושה עבור כל שני מספרים חיוביים • publicstaticint secret(int a, int b) • } • if (a==b) • returna; • else • if (a>=b) • returnsecret(b,a-b); • else • returnsecret(a,b-a); • {

  9. תרגיל 4 • כתבו פונקציה רקורסיבית שמקבלת מחרוזת ומחזירה true אם היא פָּלִינְדְרוֹם ו- false אחרת. תזכורת: פָלִינְדְרוֹם היא מחרוזת שניתן לקרוא משני הכיוונים, משמאל לימין ומימין לשמאל, ולקבל אותה תוצאה. לדוגמא: המחרוזות "ארון קיר היה ריק נורא", "ילד כותב בתוך דלי" ו- madam הן פָלִינְדְרוֹם, לעומת זאת המחרוזת hello אינה פָלִינְדְרוֹם. הנחת יסוד: מחרוזת ריקה (ללא תווים) ומחרוזת בעלת תו אחד הן פָלִינְדְרוֹם.

  10. תרגיל 4 – דרך פעולה דרך פעולה: מקרה הבסיס: אם מדובר במחרוזת ריקה (ללא תווים) או במחרוזת בעלת תו אחד ניתן להחזיר true . אחרת, נבדוק עבור מחרוזת קטנה יותר (הקטנת הבעיה) ע"י צמצום המחרוזת בתו אחד מכל צד. אם הפעלת הפונקציה הרקורסיבית על המחרוזת המוקטנת תחזיר true וגם שני התווים הקיצוניים שהורדנו מהמחרוזת המקורית שווים נחזיר true, אחרת נחזיר false.

  11. תרגיל 4 - פתרון publicstaticboolean isPalindrome(String pal) { boolean isPal = false; int length = pal.length(); if (length == 0 || length == 1) // can be “if (length <= 1)” instead isPal = true; else { isPal = (pal.charAt(0)==pal.charAt(length-1) && isPalindrome(pal.substring(1,length-1))); } return isPal; }

  12. הדפסת הפרמוטציות של מחרוזת • פרמוטציה של מחרוזת מוגדרת כמחרוזת המכילה את אותן אותיות, ייתכן שבשינוי סדר. נניח בדוגמה זו שכל האותיות שונות זו מזו. • למשל הפרמוטציות עבור המחרוזת bcd הם: • “bcd" • “bdc" • “cbd“ • “cdb” • “dbc“ • “dcb”

  13. הרעיון של הרקורסיה ““, “a” + “b” + “c” +”d” i=0 i=1 d, “a” + “b” + “c” output: abcd cd, “a” + “b” i=0 cd, “a” + “b” bcd, “a” i=0 bcd, “a” נרוץ עם i מ0 עד גודל המחרוזת ועבור כל i נבחן את כל המחרזות האפשריות בהן התו הi הוא הראשון כך שבכל קריאה i הוא האינדקס של האות הבאה אותה מצרפים למחרוזת i=0 abcd,”” abcd,””

  14. הרעיון של הרקורסיה ““, “a” + “b” + “c” +”d” i=1 d, “a” + “b” + “c” output: abcd cd, “a” + “b” i=0 i=1 cd, “a” + “b” i=0 bcd, “a” bcd, “a” i=0 abcd,”” abcd,””

  15. הרעיון של הרקורסיה ““, “a” + “b” + “c” +”d” d, “a” + “b” + “c” output: abcd i=1 i=2 cd, “a” + “b” cd, “a” + “b” “”, “a” + “b” + “d” + “c” i=0 c, “a” + “b” + “d” output: abdc bcd, “a” bcd, “a” i=0 abcd,”” abcd,””

  16. הרעיון של הרקורסיה ““, “a” + “b” + “c” +”d” d, “a” + “b” + “c” output: abcd i=1 cd, “a” + “b” cd, “a” + “b” i=1 “”, “a” + “b” + “d” + “c” i=1 c, “a” + “b” + “d” output: abdc bcd, “a” bcd, “a” i=0 abcd,”” abcd,”” bd, “a” + “c” bd, “a” + “c” d, “a” + “c” + “b” output: acbd “”, “a” + “c” + “b” + “d”

  17. הרעיון של הרקורסיה ““, “a” + “b” + “c” +”d” d, “a” + “b” + “c” output: abcd cd, “a” + “b” cd, “a” + “b” “”, “a” + “b” + “d” + “c” i=3 c, “a” + “b” + “d” output: abdc bcd, “a” bcd, “a” abcd,”” abcd,”” bd, “a” + “c” bd, “a” + “c” d, “a” + “c” + “b” . . . bc, “a” + “d” output: acbd “”, “a” + “c” + “b” + “d” . . .

  18. קוד הדפסת הפרמוטציות של מחרוזת public static void perms(String s){ // We call the method perm(s,"") which prints // the empty string followed by each permutation // of s the empty string. perms(s,""); }

  19. קוד הדפסת הפרמוטציות של מחרוזת /** Function prints all the permutation of a string. * Note: assume the string is a set (no duplicate * chars) */ // Prints string acc followed by all permutations of // string s1 publicstaticvoidperms(String s1, String acc){ if (s1.length()==0) System.out.println(acc); else for (int i=0; i<s1.length(); i=i+1) perms(delete(s1, i), acc +s1.charAt(i)); }

  20. פונק' עזר: delete // This function returns the string s with the i-th // character removed publicstatic String delete(String s, inti){ // Assumes that i is a position in the string returns.substring(0,i) + s.substring(i+1,s.length()); }

More Related