שאלת מבחן במבוא למדעי המחשב - האוניברסיטה הפתוחה 2017 - רקורסיה

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

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

ב. ימין, שמאל, ימין, ימין

ג. ימין, ימין, שמאל, ימין

ד. ימין, ימין, ימין, שמאל

3. אם
ו- , התשובה היא 0. אין אף דרך אפשרית להגיע בארבעה צעדים לנקודה הנמצאת במרחק שלושה צעדים מימין.

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


חתימת השיטה היא:



השיטה שתכתבו צריכה להיות רקורסיבית ללא שימוש בלולאות כלל. כך גם כל שיטות העזר שתכתבו (אם תכתבו) לא יכולות להכיל לולאות.
אפשר להשתמש בהעמסת יתר (overloading)

אין צורך לדאוג ליעילות השיטה! אל תשכחו לתעד את מה שכתבתם!
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד 842017סמסטר ב
רקורסיה
חשבו על הצעד האחרון בדרך. אם הצעד ה- היה ימינה, היכן היה צריך להיות האדם לאחר צעדים? ומה אם הצעד האחרון היה שמאלה?
הפתרון לבעיה זו מבוסס על חשיבה רקורסיבית. הרעיון המרכזי הוא לפרק את הבעיה של מציאת מספר הדרכים ב- צעדים לבעיות קטנות יותר, של מציאת מספר הדרכים ב- צעדים.

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

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



כעת, עלינו להגדיר את תנאי העצירה של הרקורסיה. הרקורסיה נעצרת כאשר לא נותרו יותר צעדים לביצוע, כלומר כאשר .
  • אם וגם : הגענו בדיוק ליעד (המרחק הנותר הוא 0) והשתמשנו בכל הצעדים. זוהי דרך חוקית אחת, ולכן הפונקציה תחזיר 1.
  • אם אבל : נגמרו לנו הצעדים, אך לא הגענו ליעד. זוהי אינה דרך חוקית, ולכן הפונקציה תחזיר 0.


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

להלן מימוש השיטה ב-Java, בהתאם להגדרה הרקורסיבית:



הפתרון עונה על כל דרישות השאלה: הוא רקורסיבי טהור ואינו משתמש בלולאות. הוא מטפל נכון במקרים השונים ומגיע לתנאי עצירה מוגדרים היטב.