תכנות ב JAVA תרגול 7 רקורסיה 26.3.2013 - PowerPoint PPT Presentation

yardley-pittman
slide1 n.
Skip this Video
Loading SlideShow in 5 Seconds..
תכנות ב JAVA תרגול 7 רקורסיה 26.3.2013 PowerPoint Presentation
Download Presentation
תכנות ב JAVA תרגול 7 רקורסיה 26.3.2013

play fullscreen
1 / 20
Download Presentation
תכנות ב JAVA תרגול 7 רקורסיה 26.3.2013
144 Views
Download Presentation

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - 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()); }