Download presentation
Presentation is loading. Please wait.
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.