
הטקסט המלא של הדקות הראשונות בהרצאה «הסבר כללי על רקורסיה בג'אווה» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לאחד הנושאים המורכבים ביותר אבל המעניינים שקיימים בתחום המבוא לתכנות ואלגוריתמיקה. והנושא הזה נקרא רקורסיה. דבר ראשון, בואו נבין מה זה רקורסיה.
רקורסיה זה פשוט פונקציה שקורית לעצמה. הקריאה הרקורסיבית, זה בדיוק הקריאה שבה הפונקציה קורית לעצמה, גורמת לפונקציה לקפוץ לתחילת התוכנית כמו שחושבים בהתחלה, אלא גורמת למערכת לפתוח מופע חדש לגמרי של הפונקציה.
הפונקציה הכורת, The calling function, זאת שבתוכה הייתה את הקריאה, ממתינה עד שהמופע החדש יסתיים לגמרי. המופע החדש של הפונקציה מתחיל מחדש, מאפס, כל המשתנים הלוקאליים שנוצרים מחדש לגמרי ללא קשר למופע הקודם, אפילו שזאת אותה הפונקציה בדיוק.
כאשר המופע החדש שקראנו מסתיים, הפונקציה נסגרת, המופע החדש נסגר, ואנחנו ממשיכים מאותו המקום שעזבנו במופע הקודם של הפונקציה, כלומר בדיוק אחרי הקריאה לפונקציה.
איך נכון לכתוב רקורסיה? כאשר אנחנו כותבים רקורסיה, יש ארבעה צעדים שאנחנו צריכים לבצע ולהביא לתשומת הלב ולהתחשב בהם כאשר אנחנו כותבים רקורסיביה.
צעד ראשון, החתימה של הפונקציה. החתימה של הפונקציה זה בעצם הכותרת שלה, זה השם, זה הארגומנטים שהיא מקבלת וזה הערך המוחזר. החתימה של הפונקציה ברוב הגדול של המקרים יהיה בדיוק כמו חתימה של פונקציה רגילה שאינה רקורסיבית.
אני רוצה כרגע לבנות איזו פונקציה והיא לא אמורה להיות רקורסיבית, אני בעצם בונה את החתימה לפי מה שהפונקציה אמורה לקבל ולפי מה שהיא אמורה להחזיר. גם אם אני עושה את הפונקציה הזאת רקורסיבית מאיזושהי סיבה, אז אני משאיר את אותה החתימה בדיוק.
ברוב רוב המקרים אני בעצם לוקח את אותה חתימה, מה היא אמורה לקבל, מה היא אמורה להחזיר. זה שהיא רקורסיבית זה פחות משנה לי. תנאי יציאה.
תנאי יציאה מהפונקציה זה משהו שחייב להיות בפונקציה, אם לא יהיה תנאי יציאה אז הפונקציה לנצח תקרע לעצמה ותקרע לעצמה ותקרע לעצמה שוב ושוב ושוב ובסופו של דבר התוכנית לא יהיה לה יותר מקום למשתנים הלוקאליים שכל הזמן נוצרים ולכתובת של הפונקציה שכל הזמן נוצרת בזיכרון שוב ושוב ושוב ושוב
ומהר מאוד התוכנית תקרוס. סוג של הכריסה הזאת נקרא Stack Overflow Exception. כנראה שזה בעצם המקור של השם של האתר הידוע Stack Overflow.
לכן חייב להיות לנו איזה תנאי יציאה כזה מהפונקציה, שאם הוא מתקיים אז אנחנו יוצאים מיידית מהפונקציה ולא ממשיכים לבצע שוב ושוב את הקריאות הרקורסיביות לפונקציה עצמה.
הצעד השלישי, ואנחנו צריכים להסתכל על כל המטלה שעלינו לבצע בפונקציה,