תרגול מס' 7: תרגילים מתקדמים ברקורסיה

מסמכים קשורים
מבוא לתכנות ב- JAVA תרגול 7

אוניברסיטת בן גוריון בנגב תאריך המבחן: שקולניק אלכסנדר שם המרצה: מר בשפת JAVA מבוא לתכנות מבחן ב: מס' הקורס : הנדסת תעשיה וניהול מ

Slide 1

תרגול 1

מהוא לתכנות ב- JAVA מעבדה 3

אוניברסיטת בן גוריון בנגב תאריך המבחן: שם המרצה: מר אלכסנדר שקולניק, בשפת JAVA מבחן ב: מבוא לתכנות מס' הקורס : מיועד לתלמידי : הנד

תרגול 3 - מערכים

פתרון מוצע לבחינת מה"ט ב_שפת c מועד ב אביב תשע"ט, אפריל 2019 מחברת: גב' זהבה לביא, מכללת אורט רחובות שאלה מספר 1 מוגדרת מחרוזת המורכבת מהספרות 0 עד 9.

מבוא למדעי המחשב

מבוא למדעי המחשב

אוניברסיטת חיפה החוג למדעי המחשב מבוא למדעי המחשב מועד א' סמסטר ב', תשע"ג, משך המבחן: שעתיים וחצי חומר עזר: אסור הנחיות: וודאו כי יש בידיכם

PowerPoint Presentation

מבחן 7002 פרטים כלליים מועד הבחינה: בכל זמן מספר השאלון: 1 משך הבחינה: 3 שעות חומר עזר בשימוש: הכל )ספרים ומחברות( המלצות: קרא המלצות לפני הבחינה ובדי

מבוא למדעי המחשב

Slide 1

מספר מחברת: עמוד 1 מתוך 11 ת"ז: תשע"א מועד ב סמסטר א' תאריך: 00:11 שעה: 0 שעות הבחינה: משך כל חומר עזר אסור בשימוש בחינה בקורס: מבוא למדעי ה

Microsoft Word - pitaron222Java_2007.doc

תרגול 1

מבוא לתכנות ב- JAVA תרגול 11

סדנת תכנות ב C/C++

Tutorial 11

הגשה תוך שבוע בשעת התרגול

Microsoft Word - c_SimA_MoedB2005.doc

אוניברסיטת חיפה החוג למדעי המחשב.5.6 מבוא למדעי המחשב סמסטר א' תשע"ז בחינה סופית מועד א', מרצה: שולי וינטנר מתרגלים: סמאח אידריס, ראמי עילבו

מבוא למדעי המחשב

שאלהIgal : מערכים דו מימדיים רקורסיה:

מבוא למדעי המחשב, סמסטר א', תשס"ח תרגול מס' 2

Microsoft Word - c_SimA_MoedA2006.doc

מבוא למדעי המחשב - חובלים

PowerPoint Presentation

מבוא למדעי המחשב - חובלים

פתרון 2000 א. טבלת מעקב אחר ביצוע האלגוריתם הנתון עבור הערכים : פלט num = 37, sif = 7 r האם ספרת האחדות של sif שווה ל- num num 37 sif 7 שורה (1)-(2) (

מבוא למדעי המחשב

הגשה תוך שבוע בשעת התרגול

PowerPoint Presentation

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

PowerPoint Presentation

מבוא למדעי המחשב

PowerPoint Presentation

Slide 1

שאלהIgal : מערכים דו מימדיים רקורסיה:

Microsoft Word B

תרגול מס' 4: המתרגם שימוש במחלקות קיימות מחרוזות, קבצים, וקבלת קלט מהמשתמש

Slide 1

תכנות דינמי פרק 6, סעיפים 1-6, ב- Kleinberg/Tardos סכום חלקי מרחק עריכה הרעיון: במקום להרחיב פתרון חלקי יחיד בכל צעד, נרחיב כמה פתרונות אפשריים וניקח

Slide 1

מספר זהות: סמסטר ב' מועד א' תאריך: 11102/4// שעה: 9:22 משך הבחינה: 3 שעות חומר עזר: אין מותר השימוש במחשבון פשוט בחינה בקורס: מבני נתונים מרצה: הדר בי

PowerPoint Presentation

Slide 1

Programming

תאריך פרסום: תאריך הגשה: מבנה נתונים תרגיל 5 )תיאורטי( מרצה ומתרגל אחראים: צחי רוזן, דינה סבטליצקי נהלי הגשת עבודה: -את העבודה יש לה

שאלהIgal : מערכים דו מימדיים רקורסיה:

תורת החישוביות תרגול הכנה לוגיקה ותורת הקבוצות מה יש כאן? בקורס תורת החישוביות נניח ידע בסיסי בתורת הקבוצות ובלוגיקה, והכרות עם מושגים בסיסיים כמו א"ב

Slide 1

תרגיל בית מספר 1#

תוכנה 1 1 אביב תשע"ג תרגיל מספר 5 מערכים, מחרוזות, עיבוד טקסט ומבני בקרה הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס. הגש

תוכן העניינים

שעור 6

PowerPoint Presentation

מבחן סוף סמסטר מועד א 15/02/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, דניאל גנקין הוראות: א. בטופס המבחן 7 עמודים ו 4 דפי נוסחאות. ב

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

Microsoft Word - tutorial Dynamic Programming _Jun_-05.doc

PRESENTATION NAME

הטכניון מכון טכנולוגי לישראל אלגוריתמים 1 )443432( סמסטר חורף הפקולטה למדעי המחשב תרגול 9 מסלולים קלים ביותר תרגיל APSP - 1 עד כה דנו באלגור

שקופית 1

Slide 1

משימה תכנית המתרגמת קטעי טקסט לשפה אחרת הקלט: קובץ המכיל את קטעי הטקסט וכן את השפה אליה רוצים לתרגם תרגול מס' 4: המתרגם שימוש במחלקות קיימות תכנות מתק

מבוא למדעי המחשב

תרגיל בית מספר 1#

Slide 1

PowerPoint Presentation

Slide 1

Microsoft Word - Ass1Bgu2019b_java docx

תוכן העניינים

תכנון אלגוריתמים, אביב 1021, תרגול מס' 4 תכנון דינאמי תכנון דינאמי בתרגול זה נדון בבעיית הכפלת סדרת מטריצות (16.1.(CLR ראשית נראה דוגמא: דוגמא: תהינה

שבוע 4 סינטקס של HACK ASSEMBLY ניתן להשתמש בשלושה אוגרים בלבד:,A,D,M כולם בעלי 16 ביטים. M אינו אוגר ישיר- הוא מסמן את האוגר של ה RAM שאנחנו מצביעים ע

234114

PowerPoint Presentation

תשע"דד אביב תוכנה 1 תרגיל מספר 4 עיבוד מחרוזות וקריאה מקבצים הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס..(

מבחן סוף סמסטר מועד ב 28/10/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, גדי אלכסנדרוביץ הוראות: א. בטופס המבחן 6 עמודים (כולל דף זה) ו

מקביליות

תרגול 1

1 תבניות טקסט מהי תבנית טקסט? שימוש ב- Characters Meta שימוש ב- Expression Grouping שימוש ב- Quantifiers תת תבניות הפונקציה preg_match הפונקציה preg_m

Homework Dry 3

פקולטה: מחלקה: שם הקורס: קוד הקורס: מדעי הטבע מדעי המחשב ומתמטיקה מתמטיקה בדידה תאריך בחינה: _ 07/07/2015 משך הבחינה: 3 שעות סמ' _ב' מועד

Microsoft PowerPoint - rec1.ppt

מקביליות

PowerPoint Presentation

תרגול 1

סיכום הוראות Touch touchend יקרא לפונקציה כשיסתיים המגע עם הסמארטפון. - touchmove יקרא לפונקציה במהלך תזוזת המגע עם הסמארטפון. touchstart יקרא לפונקצי

Slide 1

Microsoft PowerPoint - rec3.ppt

מבוא לאנליזה נומרית na191 Assignment 2 solution - Finding Roots of Nonlinear Equations y cos(x) שאלה 1 היכן נחתכים הגרפים של? y x 3 1 ושל ממש פתרונות

Slide 1

דף נגזרות ואינטגרלים לשאלון 608 כללים למציאת נגזרת של פונקציה: n 1. y' n x n, y הנגזרת x.1 נכפול בחזקה )נרשום אותה משמאל ל- (. x א. נחסר אחד מהחזקה. ב

עוצמת ההורשה מה הופך את ההורשה לכלי כל כך עוצמתי? מעבר לכך שהוא מקל בהגדרת מחלקות חדשות על סמך מחלקות קיימות, יש לנו אפשרות להתייחס לאובייקט מסויים בכ

תמליל:

תרגול מס' :7,Memoization Quicksort ותרגילים מתקדמים ברקורסיה תרגול זה הוא התרגול האחרון שיהיה לכם בנושא רקורסיה והוא מכיל מגוון שאלות מתקדמות בנשוא זה. השאלות שיכלול תרגול זה: Memoization פיבונאצ'י Quicksort דוגמה: שאלה 5, בוחן 3002, סמסטר א. דוגמה: הדפסת הפרמוטציות של מחרוזת. דוגמה: הרכבת סכום נתון ממשקולות. דוגמה: שאלה 2 מועד א 3002. Memoization לאונדרדו מפיזה הידוע בשמות ליאונדרו פיזאנו, ליאונרדו בונאצ'י, או בפשטות פיבונצ'י נחשב בעיני רבים לגדול המתמטיקאים של ימי הביניים. על שמו קרויה סדרת המספרים הבאה )בניגוד לדעה הרווחת הוא לא המציא אותה, רק השתמש בה(: סדרה זו מופיעה בטבע בצורות מפתיעות: http://en.wikipedia.org/wiki/fibonacci_number public class Fib { public static int fib(int n){ int ans; if (n==0) ans = 0; else if (n==1) ans = 1; else ans = fib(n-1)+fib(n-2); return ans; public static void main(string[] args){ int n = 20; System.out.println("fib ("+n+") = "+fib(n));

ברישום הבא, מובא עץ הקריאות לפונקציה כאשר. n 5 ניתן לראות כי ישנם מספר חישובים שמתבצעים יותר מפעם אחת )אלו המודגשים בצבע(: fib(5) fib(4) fib(3) fib(3) fib(2) fib(2) fib(2) fib(0) fib(0) fib(0) ניתן לחסוך את החישובים המיותרים ע"י שמירת תוצאות של חישובים שבוצעו. :Memoization שמירה של תוצאות ביניים ב lookup tables כך שחישוב יתבצע פעם אחת לכל היותר. לכל ערך שנרצה לחשב, נבדוק תחילה האם ערך זה חושב, כלומר, האם יש עבורו ערך מתאים ב.lookup table אם כן, נשתמש בערך זה. אחרת, נבצע את החישוב ונשמור את התוצאה בכניסה המתאימה בטבלה. הערכים נשמרים בטבלה לפי ה.input כלומר, לכל קלט אפשרי יש כניסה מתאימה בטבלה. דוגמא 1: כבר ראינו פתרון רקורסיבי לחישוב האיבר ה n -י בסדרת פיבונאצ'י, וראינו כי פתרון זה אינו יעיל. הסיבה לחוסר היעילות היא חישובים שחוזרים על עצמם מספר פעמים. בכדי לייעל את הפתרון נשתמש בטכניקת ה memoization לשמירת תוצאות החישובים שבוצעו. נראה תוכנית המחשבת את האיבר ה n -י בסדרת פיבונאצ'י, אשר משתמשת בטכניקה זו ושומרת תוצאות של חישובים רקורסיביים. במקרה זה ה lookup table הינה מערך חד מימדי, כך שתא בעל אינדקס i במערך, מכיל את הערך. באם ערך זה עדיין לא חושב, יכיל תא זה את הערך 1-. f (i) public class FibMemo { public static void main(string[] args){ int n = 20; System.out.println("fibMemo("+n+") = "+fibmemo(n)); public static int fibmemo(int n){ int[] lookuptable = new int[n+1]; for (int i=0; i < lookuptable.length ; i=i+1) lookuptable[i] = -1; //EMPTY return fibmemo(lookuptable, n);

public static int fibmemo(int[] lookuptable, int n){ if (n==0) lookuptable[n] = 0; if (n==1) lookuptable[n] = 1; if (lookuptable[n] == -1) //EMPTY lookuptable[n] = fibmemo(lookuptable, n-1) + fibmemo(lookuptable,n-2); return lookuptable[n]; עבור n 20 מתבצעות 11,,11 קריאות לפונקציה הרגילה, לעומת 91 בלבד לפונקציה העושה שימוש ב- memoization. בעתיד נלמד כיצד לספור את מספר הקריאות לפונקציה בעזרת מונה. Divide-and-Conquer טכניקת ה Divide-and-Conquer מבוססת על רעיון דומה לפתרון רקורסיבי של בעיות: חלק את הבעיה המקורית לתתי בעיות קטנות )שניים או יותר( - Divide 1. פתור כל תת בעיה Conquer 1. צרף את תתי הפתרונות לפתרון לבעיה המקורית. 9. ישנם אלגוריתמים רבים המתוכננים לפי עיקרון זה, עליהם נמנים האלגוריתמים הבאים: Mergesort Quicksort Quicksort אלגוריתם למיון n איברים. בחר אלמנט ציר סדר את האיברים כך שכל s האיברים בחלקו השמאלי של המערך הינם איברים הקטנים או שווים לו. מה סדר את האיברים כך שכל n s האיברים בחלקו הימני של המערך הינם איברים הגדולים או שווים לו. מה עם האיבר הגדול ביותר בחלקו השמאלי של המערך החלף את ה מיין את שני תתי המערך בצורה רקורסיבית בדוגמא שלנו נניח כי ה הוא האיבר האחרון במערך הקלט. עבור {5,3,9,7,6 arr הרעיון הוא: ה הוא האיבר האחרון במערך הקלט חלקו השמאלי של המערך יכיל את האיברים שקטנים או שווים לו חלקו הימני יכיל את האיברים שגדולים או שווים לו

.partition נמצא במיקום הסופי שלו לאחר שלב ה p ה או בהכללה: [ i 1.. n] ו [ 0.. i 1] אח"כ יש שתי קריאות רקורסיביות עבור האינדקסים לאחר שלב ה.partition כאשר באנידקס i מיקמנו את ה [ i 1.. end ] ו [ start.. i 1] הקוד import java.util.scanner; public class QuickSort { public static void main(string[] args){ Scanner sc = new Scanner(System.in); System.out.println("Enter number of elements to sort:"); int n = sc.nextint(); int[] arr = new int[n]; initrandomarray(arr); // Initializes arr with random numbers in [0..10*N) System.out.println("The input array:"); printarray(arr); quicksort(arr); System.out.println("The sorted array:"); printarray(arr); public static void quicksort(int[] arr){ quicksort(arr, 0, arr.length-1); public static void quicksort(int[] arr, int start, int end){ if (start<end){ int i = partition(arr, start, end); quicksort(arr, start, i-1); quicksort(arr, i+1, end); public static int partition(int[] arr, int start, int end){ int = arr[start]; int i = start; int j = end; while(i<j){ while(i<end && arr[i] <= ) // scan upwards i=i+1; while(arr[j] > ) // scan downwards j=j-1; if (i<j) swap(arr,i,j); swap(arr,start,j); return j;

public static void swap(int[] arr, int i, int j){ // swap arr[i] and arr[j] int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; public static void initrandomarray(int[] arr){// shuffle the array arr int n = arr.length; for (int i = 0; i < n; i++) { arr[i] = (int) (Math.random() * 10 * n); public static void printarray (int[] arr) { for (int i=0; i<arr.length; i=i+1) { System.out.print (arr[i]+" "); System.out.println(); //class Quicksort דוגמה: בוחן 3002, סמסטר א. הפונקציה (n public static String[] binarynums(int מקבלת מספר n גדול או שווה לאפס )מותר להניח כי הקלט חוקי( ומחזירה מערך של 2 n המחרוזות באורך n המורכבות מאפסים ואחדים. סדר המחרוזת הוא סדר המניה מאפס ל 1- n 2 על בסיס 3 למשל: binarynums(0) יחזיר { binarynums(1) יחזיר { 0, 1 binarynums(2) יחזיר { 00, 01, 10, 11 binarynums(3) יחזיר 100, 101, 110, 111 { 000, 001, 010, 011, public static String[] binarynums(int n){ String[] answer; if (n==0){ answer = new String[1]; answer[0]=""; else { // // השלימו את הגדרת הפונקציה return answer;

תשובה: public static String[] binarynums(int n){ String[] answer; if (n==0){ answer = new String[1]; answer[0]=""; else { String[] prev = binarynums(n-1); answer = new String[2*prev.length]; for (int i =0;i<prev.length; i = i+1){ answer[i]= "0" + prev[i]; answer[prev.length + i] = "1" + prev[i]; return answer; דוגמה: הדפסת הפרמוטציות של מחרוזת פרמוטציה של מחרוזת מוגדרת כמחרוזת המכילה את אותן אותיות, ייתכן שבשינוי סדר. נניח בדוגמה זו שכל האותיות שונות זו מזו. למשל הפרמוטציות עבור המחרוזת bcd הם: bcd" bdc" cbd cdb dbc dcb public static void perms(string s){ // we call the method perm(s,"") which prints each permutation // of s followed by the empty string. perms(s,""); פתרון: /** this function prints all the permutation of a string. * Note: assume the string is a set (no duplicate chars) */ public static void perms(string s1, String acc){ // prints all permutations of string s1 followed by 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)); // this function returns the string s with the i-th // character removed public static String delete(string s, int i){ // assumes that i is a position in the string return s.substring(0,i)+s.substring(i+1,s.length()); הפונקציה :delete

דוגמה )תזכורת מתרגול 6(: הרכבת סכום נתון ממשקולות בהנתן מערך משקולות ומשקל נוסף, נרצה לבדוק האם ניתן להרכיב מהמשקולות משקל השווה למשקל הנתון. דוגמא לקלט: weights={1,7,9,3 Sum = 12 במקרה זה הפונקציה תחזיר true כי ניתן לחבר את המשקולות 9 ו 2 ולקבל את הסכום 23. דוגמא לקלט: weights={1,7,9,3 Sum = 15 במקרה זה הפונקציה תחזיר false כי לא ניתן לחבר משקולות לקבלת הסכום 25. דרך פעולה קיימים שני מקרי בסיס: 2. הגענו לסכום הדרוש או במילים אחרות הסכום הנדרש הינו אפס 3. הגענו לסוף המערך עברנו על כל האיברים ולא מצאנו צירוף של איברים שסכומם שווה לסכום הנדרש נתבונן באיבר הראשון במערך. ייתכן שהוא ייבחר לקבוצת המשקולות שתרכיב את sum ויתכן שלא. אם הוא לא ייבחר אזי נותר לפתור בעיה קטנה יותר והיא האם ניתן להרכיב את הסכום weights[1..length [1- מבין המשקולות שבתאים sum אם הוא ייבחר אזי נותר לפתור בעיה קטנה יותר והיא האם ניתן להרכיב את הסכום. weights[1..length -1] מבין המשקולות שבתאים sum weights[0] וכנ"ל לגבי יתר האיברים בצורה רקורסיבית. s(int[], calcweight אשר weights,int i, פתרון זה קל נותר להציג כפונקציה רקורסיבית sum) int מקבלת בנוסף על sum ו weights פרמטר נוסף i ומחזירה האם ניתן להרכיב את הסכום sum מבין weights [ i.. קבוצת המשקולות שבתת המערך [ 1 length public static boolean calcweights(int[] weights, int sum) { return calcweights(weights, 0, sum); public static boolean calcweights(int[] weights, int i, int sum) { boolean res = false; if (sum == 0) res = true; else if (i >= weights.length) res = false; else res = (calcweights(weights, i + 1, sum - weights[i]) calcweights(weights, i + 1, sum)); return res; עבור כל משקולת יש את האפשרות לבחור אותה לסכום או לא לבחור אותה. עובדה זו באה לידי ביטוי בקריאה הרקורסיבית.

דוגמה: מועד א 3006 השלימו את הגדרת הפונקציה ik) void subsetssum(int[] aset, int אשר מקבלת מערך aset של משקולות )ערכים שלמים חיוביים( ןמשקל שלם ik חיובי.)iK>0( הפונקציה תדפיס את כל תתי הקבוצות של איברי המערך aset שסכומם.iK לדוגמא אם {1,2,3,4,5 aset=,ik=10 הפונקציה תדפיס למסך: 1,2,3,4 1,4,5 2,3,5 הניחו כי המערך aset אינו null ושכל הערכים בו שלמים חיוביים וכי.iK>0 בנוסף, הניחו כי אין איבר המופיע במערך פעמיים. אין חשיבות לסדר האיברים בקבוצות המודפסות. בתבנית הנתונה ik) void subsetssum(int[] aset, int מתבצעת קריאה לפונקצית עזר,subsetsSum( ) בה ישנם מספר פרמטרים. השלימו את התבנית: public static void subsetssum(int[] aset, int ik){ ;( השלימו את החסר subsetssum( ( השלימו החסר ) subsetssum public static void ( השלימו את החסר סעיף א: סעיף ב: public static void subsetssum(int[] aset, int ik){ subsetssum(aset, ik,0, ); פתרון סעיף א: פתרון סעיף ב: public static void subsetssum(int[] aset, int ik, int index, String acc){ if(ik == 0) System.out.println(acc); else if (ik > 0 & index < aset.length){ subsetssum(aset, ik-aset[index], index+1, acc + aset[index] + ','); subsetssum(aset, ik, index+1, acc); { {