מבוא לתכנות ב- JAVA תרגול 7
שאלה )מועד א 2013( לפניך מספר הגדרות: תת מילה של המילה word הינה רצף של אותיות עוקבות של word פלינדרום באורך le היא מילה בעלת le אותיות שניתן לקרוא אותה משמאל לימין וגם מימין לשמאל ולקבל את אותה מילה בשני המקרים. לדוגמא abcba zz dad a תת מילה פלינדרומית באורך le של המילה word הינה תת מילה של word שהיא גם פלינדרום באוך le כתבו פעולה le) Strig subpalidrome(strig word, it שמקבלת כפרמטרים מחרוזת word ומספר שלם חיובי le ומחזירה העתק של תת מילה פלינדרומית באורך le של.word אם word לא מכילה תת מילה פלינדרומית באורך le הפונקציה מחזירה מחרוזת ריקה. הנחות על הקלט: הניחו כי בכל מקרה הפונקציה מקבלת מילה חוקית שבה לא תהיה יותר מתת מילה פלינדרומית אחת באורך le וכן ש le לא יהיה יותר גדול מאורכה של word
פתרון public static Strig subpalidrome(strig word, it le){ Strig sub = ""; for (it i=0; i + le <= word.legth(); i++){ if (ispal(word.substrig(i, i+le))){ sub = word.substrig(i, i+le); retur sub; פונקצית עזר: public static boolea ispal(strig str){ for (it i = 0; i < str.legth() / 2; i++){ if (str.charat(i)!= str.charat(str.legth()-i-1)){ retur false; retur true;
רקורסיה - הקדמה הגדרה רקורסיבית: חדר הוא מסודר אם צד שמאל שלו מסודר שלו מסודר. וצד ימין שיטת פתרון רקורסיבית: פתרון מופעים פשוטים יותר של בעיה בכדי לפתור את הבעיה המקורית
רקורסיה - הקדמה פונקציה רקורסיבית: פונקציה שקוראת לעצמה באופן ישיר או עקיף )דרך פונקציה אחרת( f()=! דוגמא : הגדרה איטרטיבית: f()=1*2* * הגדרה רקורסיבית: אם >1 אזי f() = f(-1) * אם = 0,1 אזי f()=1
דוגמא - חישוב עצרת בצורה רקורסיבית פונקציה רקורסיבית לחישוב! public static it factorial(it ){ retur * factorial(-1); public static void mai(strig[] args){ System.out.pritl(factorial(3));
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * factorial(-1);
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * factorial(-1);
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * factorial(-1); factorial(2) 2 retur * factorial(-1);
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * factorial(-1); factorial(2) 2 retur * factorial(-1);
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * factorial(-1); factorial(2) 2 retur * factorial(-1); factorial(1) 1 retur * factorial(-1);
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * factorial(-1); factorial(2) 2 retur * factorial(-1); factorial(1) 1 retur * factorial(-1);
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * factorial(-1); factorial(2) 2 retur * factorial(-1); factorial(1) 1 1 retur * factorial(-1);
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * factorial(-1); factorial(2) 2 retur * 1;
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * factorial(-1); factorial(2) 2 2 retur * 1;
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * 2;
מה קורה במהלך החישוב factorial(3) 3 עבור הקריאה factorial(3) retur * 2; 6 הערך שיוחזר מהקריאה factorial(3) הוא
מבנה של פונקציה רקורסיבית.2 פונקציה רקורסיבית מורכבת משני חלקים עיקריים 1. תנאי עצירה: מקרה/מקרים פשוטים בהם התוצאה לא מצריכה קריאה רקורסיבית לחישוב צעד רקורסיבי: קריאה לפונקציה עם קלט קטן יותר או בעיה פשוטה יותר )הקטנת הבעיה( המקרבת אותנו לתנאי העצירה לצורך חישוב התוצאה המוחזרת
מימוש הכללים בדוגמא לחישוב עצרת public static it factorial(it ){ retur * factorial(-1); מקרי בסיס קריאה רקורסיבית עם בעיה מוקטנת שימוש בתוצאת הקריאה הרקורסיבית
רקורסיה הדדית?eve(4) public static boolea eve(it ) { boolea as; if ( == 0) as = true; else as = odd( - 1); retur as; public static boolea odd(it ) { boolea as; if ( == 0) as = false; else as = eve( - 1); retur as; איזה קריאות יהיו לנו עבור
תרגיל סכום ספרות של מספר כתבו פונקציה רקורסיבית שמקבלת כקלט מספר um ומחזירה את סכום ספרותיו מהם מקרי הבסיס? כיצד ניתן להקטין את הבעיה?
פתרון - סכום ספרות של מספר מקרה בסיס: סכום הספרות של מספר עם ספרה אחת הוא המספר עצמו הקטנת הבעיה 123165 public static it sumdigits(it um){ if (um < 10){ retur um; retur sumdigits(um / 10) + (um % 10);
דוגמת הרצה sumdigits(234557) 26 sumdigits(234557) sumdigits(23455) + 7 19 sumdigits(2345) + 5 14 sumdigits(234) + 5 9 sumdigits(23) + 4 5 sumdigits(2) + 3
תרגיל מה יודפס עבור כל אחת מן התוכניות הבאות? public static void prit1(it ){ if ( == 0){ System.out.pritl(); else{ prit1(-1); System.out.pritl(); public static void mai(strig[] args){ prit1(4); public static void prit2(it ){ if ( == 0){ System.out.pritl(); else{ System.out.pritl(); prit2(-1); public static void mai(strig[] args){ prit2(4);
תרגיל מה יודפס עבור כל אחת מן התוכניות הבאות? prit1: 0 1 2 3 4 prit2: 4 3 2 1 0
תרגיל- מעקב אחר פונקציה רקורסיבית מה הפונקציה הבאה מחשבת?: public static it mystery(it a, it b) { it as; if (b == 0) { as = 1; else if (b % 2 == 0) { as = mystery(a*a, b/2); else { as = mystery(a*a, b/2) * a; retur as; מבוא למדעי המחשב, בן גוריון 26
תרגיל- מעקב אחר פונקציה רקורסיבית mystery(2,5) mystery(4,2)*2 mystery(16,1)*2 mystery(256,0)*32 1*32 32=2^5 מבוא למדעי המחשב, בן גוריון 27
הפרד ומשול שיטה בה מחלקים את הבעיה המקורית ל 2 או יותר תתי בעיות מאותה הצורה )או צורה דומה לה(, עד שהבעיות הופכות לפשוטות כדי שניתן יהיה לפתור אותן ישירות. לאחר מכן הפתרונות לתת הבעיות משולבים יחד כדי לתת פתרון לבעיה המקורית. איך למצוא מחט בערימת שחת?
דוגמא לשימוש בעקרון של הפרד ומשול מציאת מקסימום במערך אלגוריתם רקורסיבי בשיטת הפרד ומשול למציאת מקסימום במערך: מצא מקסימום בחצי המערך השמאלי באופן רקורסיבי מצא מקסימום בחצי המערך הימני באופן רקורסיבי החזר את המקסימום מבין התוצאות שקיבלת max1 max2 maxarray = maximum betwee max1,max2
דוגמא לשימוש בעקרון של הפרד ומשול מציאת מקסימום במערך השלימו את הקוד כך שהפונקציה תמצא את המקסימום במערך בשיטת הפרד ומשול public static it fidmax(it[] arr, it begi, it ed){ it max1,max2; Base case Recursive steps if (max1 > max2){ retur max1; retur max2;
פתרון public static it fidmax(it[] arr, it begi, it ed){ it max1,max2; if (begi == ed){ retur arr[begi]; it middle = (begi + ed) / 2; max1 = fidmax(arr, begi, middle); max2 = fidmax(arr, middle+1, ed); if (max1 > max2){ retur max1; retur max2;