שאלת מבחן במבוא למדעי המחשב - אוניברסיטת בן גוריון 2018 - רקורסיה
סדרת פיבונאצ'י היא הסדרה הבאה:
שני האיברים הראשונים (המודגשים) בסדרה, שהם האיבר ה-0 והאיבר ה-1, שווים לאחד. החל מהאיבר ה-2 כל איבר שווה לסכום שני האיברים הקודמים לו בסדרה.
נסמן את האיבר ה-n בסדרה ב-
סעיף א - משימת חימום (2 נקודות)
השלימו בדף התשובות את הגדרת הפונקציה הרקורסיבית
המקבלת מספר אי-שלילי n ומחזירה את האיבר ה-n בסדרה.
יש להניח שהקלט תקין. כלומר .
סעיף ב (10 נקודות)
השלימו בדף התשובות את הגדרת הפונקציה הרקורסיבית
המקבלת שני מספרים n ו-k כך ש- ומחזירה את מספר הקריאות המתבצעות ל-
דוגמה: הפלט של קטע הקוד הבא:
הוא
יש להניח שהקלט תקין. כלומר .
סעיף ג (13 נקודות)
הפונקציה הרקורסיבית שכתבתם בסעיף ב', כמו הפונקציה שכתבתם בסעיף א', מבצעת חישובים חוזרים.
השלימו בדף התשובות את הגדרת הפונקציה
המקבלת שני מספרים n ו-k כך ש- ומחזירה את מספר הקריאות המתבצעות ל-
הדרכת חובה: יש לכתוב פונקציית עזר רקורסיבית אחת.
יש להניח שהקלט תקין. כלומר .
שני האיברים הראשונים (המודגשים) בסדרה, שהם האיבר ה-0 והאיבר ה-1, שווים לאחד. החל מהאיבר ה-2 כל איבר שווה לסכום שני האיברים הקודמים לו בסדרה.
נסמן את האיבר ה-n בסדרה ב-
fib(n).סעיף א - משימת חימום (2 נקודות)
השלימו בדף התשובות את הגדרת הפונקציה הרקורסיבית
המקבלת מספר אי-שלילי n ומחזירה את האיבר ה-n בסדרה.
יש להניח שהקלט תקין. כלומר .
סעיף ב (10 נקודות)
השלימו בדף התשובות את הגדרת הפונקציה הרקורסיבית
המקבלת שני מספרים n ו-k כך ש- ומחזירה את מספר הקריאות המתבצעות ל-
fib(k) במהלך החישוב של הקריאה לפונקציה הרקורסיבית fib(n) שכתבתם בסעיף א'. למשל, במהלך החישוב של הקריאה לפונקציה fib(5), יש בדיוק קריאה אחת לפונקציה fib(5) ובדיוק שלוש קריאות לפונקציה fib(2).דוגמה: הפלט של קטע הקוד הבא:
הוא
1 3 2 0 1
יש להניח שהקלט תקין. כלומר .
סעיף ג (13 נקודות)
הפונקציה הרקורסיבית שכתבתם בסעיף ב', כמו הפונקציה שכתבתם בסעיף א', מבצעת חישובים חוזרים.
השלימו בדף התשובות את הגדרת הפונקציה
המקבלת שני מספרים n ו-k כך ש- ומחזירה את מספר הקריאות המתבצעות ל-
fib(k) במהלך החישוב של הקריאה לפונקציה הרקורסיבית fib(n) שכתבתם בסעיף א', באופן ש- fibCount2 אינה מבצעת חישובים מיותרים.הדרכת חובה: יש לכתוב פונקציית עזר רקורסיבית אחת.
יש להניח שהקלט תקין. כלומר .
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בן גוריוןמועד א · 2018 · סמסטר א
★★★★★
רקורסיהיעילותסיבוכיות זמןmemoizationמעקב אחר קודמערך דו-ממדי
לסעיף ב', נסחו הגדרה רקורסיבית עבור מספר הקריאות. לסעיף ג', השתמשו בטכניקת ממואיזציה (memoization) עם מערך דו-ממדי כדי למנוע חישובים חוזרים.
סעיף א
המימוש הרקורסיבי של פונקציית פיבונאצ'י לפי ההגדרה הנתונה:
- תנאי עצירה: עבור
n=0אוn=1, הפונקציה מחזירה 1. - הצעד הרקורסיבי: עבור
n > 1, הפונקציה קוראת לעצמה עבורn-1ו-n-2ומחזירה את סכום התוצאות.
סעיף ב
המטרה היא לספור את מספר הקריאות ל-
fib(k) במהלך חישוב fib(n). ננתח את עץ הרקורסיה של fib(n):- אם
n == k, זוהי הקריאה הראשית עצמה, ולכן יש קריאה אחת. - אם
n < k,fib(k)לא יכולה להיקרא, כי ערך הפרמטר בקריאות הרקורסיביות רק יורד. לכן יש אפס קריאות. (מקרה זה אינו אפשרי לפי הגדרת השאלה ). - אם
n > k: - אם
nהוא 0 או 1,fib(n)הוא מקרה בסיס ואינו מבצע קריאות רקורסיביות נוספות. לכן, מספר הקריאות ל-fib(k)הוא אפס. - אם
n > 1,fib(n)קורא ל-fib(n-1)ול-fib(n-2). מספר הקריאות הכולל ל-fib(k)הוא סכום הקריאות שנוצרו משני ענפי החישוב הללו.
זה מוביל להגדרה רקורסיבית עבור
fibCount1(n, k):סעיף ג
הפונקציה
fibCount1 סובלת מבעיית חישובים חוזרים (overlapping subproblems), בדומה לפונקציה fib המקורית. כדי לייעל אותה, נשתמש בטכניקת תכנון דינמי עם ממואיזציה (memoization). נכתוב פונקציית עזר רקורסיבית שתקבל, בנוסף ל-n ו-k, גם מערך המשמש כזכרון מטמון (memo) לאחסון תוצאות שכבר חושבו.פונקציית העזר
fibCount2Helper תפעל כך:1. לפני כל חישוב, היא תבדוק במערך
memo אם התוצאה עבור (n, k) כבר קיימת. אם כן, היא תחזיר אותה ישירות.2. אם התוצאה אינה קיימת, היא תחשב אותה באמצעות אותה לוגיקה רקורסיבית מסעיף ב'.
3. לאחר החישוב, היא תאחסן את התוצאה החדשה במערך
memo לפני שתחזיר אותה.הפונקציה הציבורית
fibCount2 תיצור ותאתחל את מערך המטמון ותפעיל את פונקציית העזר.