מבוא לתכנות ב- JAVA תרגול 7
רקורסיה - הקדמה הגדרה רקורסיבית: חדר הוא מסודר אם צד שמאל שלו מסודר שלו מסודר. וצד ימין שיטת פתרון רקורסיבית: פתרון מופעים פשוטים יותר של בעיה בכדי לפתור את הבעיה המקורית
רקורסיה - הקדמה פונקציה רקורסיבית: פונקציה שקוראת לעצמה באופן ישיר או עקיף )דרך פונקציה אחרת( f(n)=n! דוגמא )הרצאה( : הגדרה איטרטיבית: f(n)=1*2* *n הגדרה רקורסיבית: אם n>1 אזי f(n) = f(n-1) * n אם = 0,1 n אזי f(n)=1
מבנה של פונקציה רקורסיבית.2 פונקציה רקורסיבית מורכבת משני חלקים עיקריים 1. תנאי עצירה: מקרה/מקרים פשוטים בהם התוצאה לא מצריכה קריאה רקורסיבית לחישוב צעד רקורסיבי: קריאה לפונקציה עם קלט קטן יותר או בעיה פשוטה יותר )הקטנת הבעיה( המקרבת אותנו לתנאי העצירה לצורך חישוב התוצאה המוחזרת
Recursive addition public static int add(int a, int b) { if(b == 0) return a; if(b < 0) return add(a-1,b+1); return add(a+1,b-1); קריאה רקורסיבית עם בעיה מוקטנת מקרי בסיס a b 5 2 6 1 7 0 a b 5-2 public static void main(string[] args) { 4-1 int x=reader.nextint(); // 5 int y=reader.nextint(); // 2 System.out.println(add(x,y)); 3 0 // main 5
Recursive subtraction public static int sub(int a, int b) { if(b == 0) return a; if(b < 0) return sub(a+1,b+1); return sub(a-1,b-1); קריאה רקורסיבית עם בעיה מוקטנת מקרי בסיס a b 5 2 4 1 3 0 5-2 public static void main(string[] args) { 6-1 int x=reader.nextint(); // 5 int y=reader.nextint(); // 2 7 0 System.out.println(sub(x,y)); //main 6 a b
חילוק מספר נשתמש בפונקציות הרקורסיביות sub(a,b) ו- add(a,b) כדי לחשב רקורסיבית חילוק של מספר שלם במספר שלם. ראשית נרשום את מקרי הבסיס: public static int divide(int a, int b) { if(b == 0) return 0; if(a < b) return 0; if(b == 1) return a;...
public static int divide(int a, int b) { if(b == 0) return 0; if(a < b) return 0; if(b == 1) return a; return add(1, divide(sub(a,b),b)); חילוק רקורסיבי מקרי בסיס קריאה רקורסיבית עם בעיה מוקטנת Divide(6,3) 2 a 6 b 3 add(1, 1); =2 add(1, divide(sub(a,b),b)); Divide(3,3) 1 a 3 b 3 add(1, 0); =1 add(1, divide(sub(a,b),b)); Divide(0,3) 0 a 0 b 3
חילוק רקורסיבי public static int divide(int a, int b) { if(b == 0) return 0; if(a < b) return 0; if(b == 1) return a; return add(1, divide(sub(a,b),b)); מקרי בסיס קריאה רקורסיבית עם בעיה מוקטנת add(1, 1); =2 1 add(1, 0); =1 0 2 Divide(21,10) a 21 b 10 Divide(11,10) a 11 b 10 Divide(1,10) a 1 b 10 add(1, divide(sub(a,b),b)); add(1, divide(sub(a,b),b));
רקורסיה הדדית public static boolean iseven(int n) { boolean ans; if (n == 0) ans = true; ans = isodd(n - 1); return ans;?iseven(4) public static boolean isodd(int n) { boolean ans; if (n == 0) ans = false; ans = iseven(n - 1); return ans; איזה קריאות יהיו לנו עבור
תרגיל סכום ספרות של מספר כתבו פונקציה רקורסיבית שמקבלת כקלט מספר num ומחזירה את סכום ספרותיו מהם מקרי הבסיס? כיצד ניתן להקטין את הבעיה?
פתרון - סכום ספרות של מספר מקרה בסיס: סכום הספרות של מספר עם ספרה אחת הוא המספר עצמו הקטנת הבעיה 123165 public static int sumdigits(int num){ if (num < 10){ return num; return sumdigits(num / 10) + (num % 10);
דוגמת הרצה sumdigits(234557) sumdigits(234557) 26 public static int sumdigits(int num){ if (num < 10){ return num; return sumdigits(num / 10) + (num % 10); sumdigits(23455) + 7 19 sumdigits(2345) + 5 14 sumdigits(234) + 5 9 sumdigits(23) + 4 5 sumdigits(2) + 3
תרגיל מה יודפס עבור כל אחת מן התוכניות הבאות? public static void print1(int n){ if (n == 0){ System.out.println(n); { print1(n-1); System.out.println(n); public static void main(string[] args){ print1(4); public static void print2(int n){ if (n == 0){ System.out.println(n); { System.out.println(n); print2(n-1); public static void main(string[] args){ print2(4);
פתרון מה יודפס עבור כל אחת מן התוכניות הבאות? public static void print1(int n){ if (n == 0){ System.out.println(n); { print1(n-1); System.out.println(n); public static void main(string[] args){ print1: 0 1 2 3 4 print1(4); public static void print2(int n){ if (n == 0){ System.out.println(n); { System.out.println(n); print2(n-1); public static void main(string[] args){ print2: 4 3 2 1 0 print2(4);
תרגיל- מעקב אחר פונקציה רקורסיבית מה הפונקציה הבאה מחשבת? )קלט 5=b,2=a(. לדוגמא: public static int mystery(int a, int b) { int ans; if (b == 0) { ans = 1; if (b % 2 == 0) { ans = mystery(a*a, b/2); { ans = mystery(a*a, b/2) * a; return ans; מבוא למדעי המחשב, בן גוריון 16
פתרון - מעקב אחר פונקציה רקורסיבית מה הפונקציה הבאה מחשבת?: public static int mystery(int a, int b) { int ans; if (b == 0) { ans = 1; if (b % 2 == 0) { ans = mystery(a*a, b/2); { ans = mystery(a*a, b/2) * a; return ans; mystery(2,5) mystery(4,2)*2 mystery(16,1) mystery(256,0)*16 Returns: 16*1*2=32 32=2^5 מבוא למדעי המחשב, בן גוריון 17
מועד א' 2013
מועד א' 2013 פתרון What(0)=1 What(1)=for[0..1]: What(0)=1 What(2)=for [0..2]: what(0)+what(1) = 2 What(3)=for [0..3]: what(0)+what(1)+what(2) = 4 what = 8 What(4)=for [0..4]: what(0)+what(1)+what(2)+what(3) = 8