תכנות בשפת C תרגול 8 רקורסיה 07.04.2011.

Slides:



Advertisements
מצגות קשורות
תכנות בשפת C תרגול 11 - קבצים.
Advertisements

הרצאה 02 סוגי משתנים קרן כליף.
יצירת מקרו הפעלת מקרו יצירת לחצן / פקד דוגמה מסכמת
Computer Programming Fall 2012 תרגול 6 פונקציות
הרצאה 12: מיזוג, מיון ושימושים לפעולות על קבוצות - המשך
מבוא לתכנות ב-JAVA מעבדה 1
תוכנה 1 תרגול 13 – סיכום.
תרגול 11: רקורסיה ופיתוח טלסקופי
תרגול 1: סביבת העבודה ומבוא ל-Java
לולאות Department of Computer Science-BGU 19 יולי 19.
נערך ע"י אריק הוד, הגימנסיה העברית הרצליה
תרגול 5: לולאות ומערכים.
מיונים (SORTS) שמושים ביישומים רבים
מבוא למדעי המחשב מ' - תירגול 9
תירגול 10: מבנים (structs) וקבצים
Marina Kogan Sadetsky –
רמי כהן, מדעי המחשב, הטכניוןכל הזכויות שמורות ©
הרצאה 3: משפטים, תנאים ולולאות
רקורסיה ופתרונות רקורסיביים
מבוא למדעי המחשב הרצאה מספר 12: רקורסיה
תכנות בשפת C תרגול 11 רשימות מקושרות מבנים
תרגול Introduction to C - Fall Amir Menczel.
פעולות אריתמטיות קרן כליף.
Computer Programming תרגול 1 Summer 2016
תירגול 11: מיונים וחיפוש בינארי
נערך ע"י אריק הוד הגימנסיה העברית הרצליה
רקורסיה ופתרונות רקורסיביים
יסודות מבני נתונים תרגול 13: עץ פורש מינימלי - Minimum Spanning Tree (MST)
תירגול 3: לולאות, קלט, וטיפוסים
קשרי מקסוול (מתכון לתמרונים אלגבריים בבעיות תרמודינאמיות)
Engineering Programming A
ניתוח עקיבות.
תירגול 8:מצביעים והקצאה דינאמית
מבוא למדעי המחשב הרצאה 9: רקורסיה
תרגול 6: פונקציות, סוגי משתנים, top-down design
תירגול 2: מבוא לתיכנות ב-C
כל הזכויות שמורות לגבריאל אנקרי © 2017
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
Web Services Delegates and Events ליווי מקצועי : ארז קלר
Direction of induced current
מבוא לתכנות מונחה עצמים Object Oriented Programming
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הרצאה 10: אלגוריתמי מיון רקורסיביים Merge sort ו-Quick sort
פרופ' מוטי בן-ארי המחלקה להוראת המדעים מכון ויצמן למדע
מבוא לתכנות למערכות מידע
Computer Architecture and System Programming Laboratory
אלגוריתמי מיון רקורסיביים
המשך תכנות מונחה עצמים תרגול מס' 9.
כל הזכויות שמורות לגבריאל אנקרי © 2017
תרגול 13 : חזרה נכתב על-ידי לימור ליבוביץ נערך ע"י ישראל גוטר
מת"מ מעבדה 7-8 רשימות.
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
תוכנה 1 תשס"ח סמסטר ב' אוהד ברזילי ליאור שפירא
אוטומטים ושפות פורמליות
שימוש בעצם ממחלקה אחרת כמאפיין במחלקה הנוכחית
מבוא לתכנות ב- JAVA מעבדה 4
מבוא למדעי המחשב סמסטר ב' – 2008 מרצה: יעל סיגל מתרגל: ענבל בודובסקי.
Introduction to Programming in C
תרגול 12: backtracking.
עקרונות תכנות מונחה עצמים תרגול 8: OOP in C++
מצביעים Pointers – המשך...
תרגול מס' 7: Memoization Quicksort תרגילים מתקדמים ברקורסיה
עקרונות תכנות מונחה עצמים תרגול 9:C++ - תרגילים
רקורסיה ופתרונות רקורסיביים
הפונקציה מחזירה את מספר התווים במחרוזת נתונה.
Engineering Programming A
רשימות מקושרות עבודה עם קבצים דוגמה
תמליל מצגת:

תכנות בשפת C תרגול 8 רקורסיה 07.04.2011

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

דוגמה מס' 1- חישוב עצרת: int iterFactorial(int n) { int res=1; while(n>0) res*=n; n--; } return res; ב) חישוב n! באופן רקורסיבי: int recFactorial(int n) { if(n<=1) return 1; return n*recFactorial(n-1); }

דוגמה מס' 1- חישוב עצרת: בעת שימוש בפונקציה זו לחישוב 3!, תרשים הסביבות יראה כך: void main() { recFactorial(3) n=3 if(n<=1) return 1; return 3* recFactorial(2) n=2 if(n<=1) return 1; return 2* recFactorial(1) 6 n=1 if(n<=1) return 1; 2 1

תזכורת – משתנים סטאטיים מגדירים באופן הבא: static int var; ניתן לאתחל בשורת ההגדרה בלבד כאשר חייבים לאתחל בביטויי קבוע!!! אם אנחנו לא מאתחלים אותם, המערכת תאתחל אותם אוטומטית לאפס. הscope- של משתנים סטאטיים הוא רק הפונקציה שבה הם הוגדרו אך הם ממשיכים להתקיים גם אחרי שביצוע הפונקציה נגמר (למעשה עד סוף ריצת התוכנית). לפיכך הערך של משתנה סטאטי בפונקציה כלשהי נשמר בין קריאות עוקבות לפונקציה זו.

דוגמה מס' 2 – harmonic number ברצוננו לכתוב פונקציה רקורסיבית rec_harmonic_num(n) אשר תדפיס למסך את הפיתוח של h(n). למשל, עבור הקריאה rec_harmonic_num(5), נקבל על המסך: 1/5+1/4+1/3+1/2+1=2.28

דוגמה מס' 2 – harmonic number void rec_harmonic_sum(int n) { static double sum=1; if(n==1)/*Stop condition*/ printf("1=%.2f\n",sum); sum=1; /*Must initialize the static variable "sum" so that we can call this function repeatedly in the same program run. Make sure you understand why!!! */ return; } printf("1/%d+",n); sum+=1./n; /*The "1." syntax is used in order to prevent automatic casting to integer type (so that the expression "1/n" will be evaluated as type double). */ rec_harmonic_sum(n-1); /*The recursive call. */

דוגמה מס' 3 – abc כתוב פונקציה רקורסיבית אשר חתימתה היא: void abc(char arr[],int lastPlace, int curPlace) המקבלת מערך של char-ים, את אינדקס סוף המערך ומספר שלם שהוא המקום במערך ממנו אנו מעונינים להתחיל במילוי המערך בתווים (בקריאה ראשונה יהיה מס' זה שווה ל- 0). הפונקציה מדפיסה את כל האפשרויות למלא את המערך מהמקום שקיבלה, curPlace, עד המקום lastPlace באותיות a,b,c במילים אחרות, מטרת הפונקציה היא להדפיס את כל האפשרויות ליצור מילה באורך מסוים בעזרת האותיות a,b,c .

דוגמה מס' 3 – abc void abcInvokingFun(char word[],int lengthOfWord){ למשל: עבור התוכנית הבאה: void abcInvokingFun(char word[],int lengthOfWord){ abc(word, lengthOfWord,0); } void main(){ char word[5]; abcInvokingFun(word,3); נקבל את הפלט: aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb cbc cca ccb ccc

דוגמה מס' 3 – abc כתובתו של תחילת המערך המקום הנוכחי שאנחנו משנים אינדקס סוף המערך void abc(char arr[],int lastPlace, int curPlace) { תנאי העצירה: אם הגענו ל- lastPlace אז שים במקום הנוכחי יש '0\' (הגענו לסוף), הדפס את המחרוזת (מהתחלתה) וחזור. if (curPlace == lastPlace) { arr[curPlace]='\0'; printf("%s\t",arr); כעת אנחנו עובדים על המקום curPlace במערך: הצב בו a, וקרא לפונק' abc (עם כתובת המערך, ואינדקס המקום הבא) אשר תדאג למילוי כל האפשרויות הקימות בשאר המערך. לאחר שחזרת, הצב את b במקום a, ושוב קרא לפונק' עם המקום הבא במערך כפרמטר. כנ"ל לגבי c. return; } arr[curPlace] = 'a'; abc (arr,lastPlace,curPlace+1); arr[curPlace] = 'b'; abc (arr,lastPlace,curPlace+1); arr[curPlace] = 'c'; }

דוגמה מס' 3 – abc נראה את תרשים הקריאות המתקבל מהרצת הדוגמא שלמעלה (בדומה לתרשים הקריאות שראינו בכתה): כל ריבוע מייצג קריאה לפונקציה, כאשר בתוך כל ריבוע מופיע תוכן המערך שהפונקציה מקבלת. ערך הפרמטרcurPlace הוא משותף לכל רמה בתרשים ומצויין בצד ימין. aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb cbc cca ccb ccc aaa הדפסה: aa? ab? ac? ba? bb? bc? ca? cb? cc? a?? b?? c?? ??? curPlace=0 curPlace=1 curPlace=2 curPlace=3

תרגיל מס' 1 כתבו פונקציה רקורסיבית המקבלת מספר שלם ומדפיסה אותו הפוך. דוגמא: בהינתן המספר 123 הפונקציה הרקורסיבית תדפיס 321.

תרגיל מס' 1 void foo(int n) { printf("%d", n % 10); if (n > 10) foo(n / 10); } מה יקרה נבצע את ההדפסה לאחר הבדיקה?

תרגיל מס' 2 כתבו תוכנית הקולטת עד 20 ערכים שלמים (1- מציין סוף קלט) למערך ומוצאת את הערך המקסימאלי. לשם כך, ניתן לפרק את הבעיה לשתי בעיות קטנות יותר כתבו פונקציה רקורסיבית שקולטת את המערך כתבו פונקציה רקורסיבית שמחזירה את הערך המקסימאלי

תרגיל מס' 2 void GetArray(int arr[], int i){ int Max(int a[], int i){ if (i > MAX_LEN – 1){ arr[i] = -1; return; } scanf("%d", &a[i]); if (arr[i] != -1) GetArray(arr, i + 1); int Max(int a[], int i){ int max; if (a[i] == -1) return a[0]; max = Max(a, i + 1); return (a[i] > max ? a[i] : max); } int main(){ int max,a[MAX_LEN]; GetArray(a, 0); max=Max(a,0); printf(“max=%d\n”max); return 0;

תרגיל מס' 3 כתוב פונקציה רקורסיבית אשר מקבלת מחרוזת s, תו ch, ומספר שלם n. הפונקציה תחפש את המופע ה- n-י של ch במחרוזת s ותחזיר את האינדקס שלו. דוגמא: בהינתן המחרוזת “abbc”, התו b, והשלם 2 (עבור n) הפונקציה תחזיר 2. התו ‘b’ מופיע בפעם השנייה במחרוזת s באינדקס 2 במחרוזת.

תרגיל מס' 3 int FindNOccurence(char s[], char ch, int n, int index){ if (n == 0) return index -1; if (s[index] == '\0') return -1; if (s[index] == ch) return FindNOccurence (s, ch, n – 1, index + 1); return FindNOccurence(s, ch, n, index + 1); {