Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת."— Presentation transcript:

1 תרגול 5 רקורסיות

2 רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת החשיבה שלנו. החסרון : פונקציה רקורסיבית תופסת יותר מקום בזיכרון מאשר לולאה.

3 רקורסיה דוגמא void star() { printf(“*”); star(); return; } בפונקציה star : מודפסת כוכבית ואח " כ מתבצעת קריאה לפונקציה star(), כלומר קריאה רקורסיבית מתי הפונקציה תסתיים ?

4 רקורסיה ואם היינו כותבים את הפונקציה star() כך ? void star() { star(); printf(“*”); return; } הפונקציה נשארת רקורסיבית אבל עכשיו הקריאה הרקורסיבית מתבצעת לפני הדפסת הכוכבית מה יקרה כעת ?

5 רקורסיה למעשה, נרצה להדפיס מספר מסויים של כוכביות ולא " אינסוף " תנאי עצירהלכן, נוסיף לפונקציה תנאי עצירה void star(int i) { if( i < 1 ) return; printf(“*”); star(i-1); return; } בכל פונקציה רקורסיבית חייב להיות תנאי עצירהבכל פונקציה רקורסיבית חייב להיות תנאי עצירה

6 רקורסיה נוח להבין פעולת פונקציה רקורסיבית כאשר מדמים כל קריאה רקורסיבית כ " העתק " חדש של אותה פונקציה ( למרות שזה לא מה שקורה בפועל ) למשל, הקריאה star(3)star(3); [i = 3] if(i<1) return;printf(“*”);star(2); [i = 2] if(i<1) return;printf(“*”);star(1); [i = 1] if(i<1) return;printf(“*”);star(0); [i = 0] if(i<1) return; return;

7 רקורסיה ישנן בעיות שהפתרון עבורן בנוי על פתרון בעיה פשוטה יותר מאותו סוג, וזה המקום להשתמש ברקורסיה מגדלי הנוידוגמא לכך היא מגדלי הנוי http://www.dynamicdrive.com/dynamicindex12/towerhanoi.htm האלגוריתם הכללי עבור n טבעות יהיה : –העבר n-1 טבעות מ -A ל -B. –העבר את טבעת מספר n מ -A ל -C. –העבר n-1 טבעות מ -B ל -C.

8 רקורסיה void Hanoi (char a, char c, char b, int n) { if(n<=0) return; Hanoi(a,b,c, n-1); printf(“\nMove ring %d from %c to %c\n”,n,a,c); Hanoi(b,c,a, n-1); return; } הקריאה לפונקציה תהיה, למשל : Hanoi(‘A’,’B’,’C’,3);

9 רקורסיה מה יודפס בכל אחת מהפונקציות כשנבצע את הקריאה הבאה : Print(5); ? פונקציה 2: void Print(int n) { int i; if(n<1) return; for(i=0;i<n;i++) printf(“*”); printf(“\n”); Print(n-1); return; } פונקציה 1: void Print(int n) { int i; if(n<1) return; Print(n-1); for(i=0;i<n;i++) printf(“*”); printf(“\n”); return; }

10 רקורסיה תרגיל :תרגיל : כתבו פונקציה אשר קוראת מהמשתמש מילה ( רצף תווים שנגמר ב -enter) ומדפיסה אותה הפוך. למשל : עבור הקלט :abcd יתקבל הפלט :dcba


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

Similar presentations


Ads by Google