
הטקסט המלא של הדקות הראשונות בהרצאה «Writing Recursion» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אז בואו ניישם את ארבעת העקרונות האלה בכדי לכתוב פונקציות רקורסיביות. הפונקציה הראשונה שנכתוב זאת בעצם הפונקציה שדיברנו עליה שמציגה n כוכביות. אז בואו נראה מה בעצם השלבים לבנייה של הפונקציה.
אם אני רוצה להציג n כוכביות בפונקציה, אז אני אבנה אותה באותה החתימה כמו פונקציה רגילה, זה היה השלב הראשון. בואו ניקח static void, print stars זה השם שלה והיא תקבל n.
הנה כבר השלב הראשון. השלב הראשון, בואו נרשום את זה כאן, function, signature. השלב הבא זה תנאי יציאה, מתי אני לא רוצה להמשיך ולבצע את הקוד של הפונקציה, exit condition.
בואו נראה, יהיה לי פה if ואנחנו צריכים לחשוב מתי בעצם אנחנו לא רוצים לבצע כלום. אם שולחים לנו לדוגמה n שווה 8, ברור שאני רוצה לבצע משהו.
אם שולחים לי n שווה 120, אני רוצה לבצע משהו, אפילו אם שולחים לי n שווה 1. אבל אם שולחים לי n שווה 0 או n שלילי, אין לי מה לעשות כרגע בפונקציה.
אז בואו נניח אם n קטן או שווה ל-0, return, צא לגמרי מהפונקציה ואל תבצע שום דבר. הנה יש לנו פה את הכלל השני, exit condition.
הכלל השלישי היה do one part from the entire task. בואו נבצע רק שלב אחד. רצינו להציג n כוכביות, שלב אחד יהיה להציג כוכבית אחת אז בואו נציג רק כוכבית אחת והשלב האחרון זה שליחה לפונקציה עצמה את שאר המטלה send the rest of the task to that function אז בואו נקרא שוב פעם לפרינט סטארס ושימו לב שאנחנו עדיין
בבנייה של פרינט סטארס אבל אני כבר יודע שאם עשיתי את הכל כמו שצריך היא עובדת פרפקט גם אם הקריאה הזאת הייתה לדוגמה כאן יכול להיות שהקריאה לפעמים היא לפני, אז אנחנו צריכים להניח שהכל בסדר.
עכשיו, מה אנחנו בעצם רוצים לשלוח? אנחנו רוצים לשלוח לא את n אלא את n פחות 1. אנחנו לא נשלח n מינוס מינוס, זה ברור שלא, כי אז אנחנו נשלח את אותו ה-n, ואנחנו גם לא נשלח מינוס מינוס n, כי אין צורך להוריד את ה-n.
אנחנו נשלח n פחות 1, קצת יותר יעיל. פה סיימנו לבנות את הפונקציה הרקורסיבית, ואנחנו רוצים לקרוא לה ולבדוק שהיא עובדת כמו שצריך.
סטרינט סטארס ובואו נשלח 5 נריץ ונראה שיש לנו על המסך 5 כוכביות. בואו ננסה לשלוח 1 ונראה על המסך שיש לנו כוכבית 1. 10 ונראה על המסך שיש לנו 10 כוכביות.
הפונקציה עובדת בצורה רקורסיבית לא היינו צריכים פה שום לולאה זה לא אומר שבפונקציות רקורסיביות אין לולאות יכול להיות בהחלט שיש אבל לא תמיד צריך כרגע אני לא צריך שום לולאה.
בואו נבנה פונקציה רקורסיבית נוספת. פעם הפונקציה מחזירה ערך. שימו לב שהפונקציה הקודמת שבנינו רק הציגה דברים על המסך. הפונקציה הבאה מחזירה אינטג'ר ובואו נגיד שאנחנו רוצים את הסכום של כל המספרים עד n.
סכום המספרים יהיה 1 ועוד 2 ועוד 3 ועוד 4 וכולי עד n. 1 ועוד 2 ועוד 3 ועוד עד n. למעשה זה בדיוק אותו הדבר כמו n ועוד n פחות 1 ועוד n פחות 2 ועוד, עד שאנחנו מגיעים בחזרה ל-1, זה בדיוק אותו הסכום.
אז מה אנחנו עושים? אז זאת החתימה של הפונקציה, קודם כל. הדבר הבא זה תנאי עצירה. מה בעצם צריך לקרות כשאנחנו יודעים שאין לנו יותר מה להמשיך?
אז בוא נניח שאנחנו רוצים לתמוך בפונקציה עם n חיובי בלבד, ושוב פעם, התנאי העצירה דומה לתנאי העצירה הקודם. אם n קטן או שווה ל-0, תחזיר לי 0.
כלומר, אין לי פה סכום איברים שאני יכול להחזיר. אני לא יכול לבצע ריטרן בצורה כזאת, מפני שהפונקציה מוגדרת ככזו שהיא מחזירה אינטג'ר.
אז נחזיר 0. עכשיו, אנחנו רוצים להחזיר רק שלב 1. שלב 1 מכל החיבורים האלה יהיה רק להחזיר את n. ריטרן n, אבל אם אני מבצע ריטרן, זהו, סיימתי.
לא הגיוני שאני אחזיר את n, אני צריך לבצע פה גם קריאה רקורסיבית. אז אני רוצה להחזיר את n ולחבר אותו עם שאר המטלה לביצוע.
זה יהיה החלק הנוכחי. שאר המטלה זה החיבורים של כל אלה. את n כבר אנחנו סוכמים פה, נשאר לנו לסכום את כל היתר, n פחות 1 ועוד n פחות 2 וכדומה.
כאן אנחנו יכולים לקרוא קריאה רקורסיבית ל-get summary ולשלוח את n פחות 1. בואו נצמצם פה טיפה ונקרא לפונקציה הזאת.
בואו נציג את הסכום של כל המספרים מ-1 עד 10. הסכום אמור להיות 55. בואו נריץ, והנה אנחנו רואים שיש לנו 55. בואו נבצע פה איזה הצגה כזאת.
sum of 1 to 10, 55. הכל עובד פרפקט.