שאלת מבחן במבוא למדעי המחשב - האוניברסיטה הפתוחה 2017 - חיפוש בינארי
השיטה הבאה אמורה למצוא איבר x בתוך מערך חד-ממדי a בעזרת חיפוש בינרי. המערך מלא במספרים שלמים מסודרים בסדר לא-יורד.
סעיף ב: (5 נקודות)
איזה שינוי (אם בכלל) צריך לעשות כדי לתקן את השיטה f שלעיל? סמנו תשובתכם על השאלון.
1. לשנות את תנאי ה-if הראשון לתנאי הזה:
2. לשנות את תנאי ה-if הראשון לתנאי הזה:
3. לשנות את תנאי ה-if הראשון לתנאי הזה:
4. לשנות את תנאי ה-while לתנאי הזה:
5. אין צורך לשנות כלום. הקוד תקין.
סעיף ב: (5 נקודות)
איזה שינוי (אם בכלל) צריך לעשות כדי לתקן את השיטה f שלעיל? סמנו תשובתכם על השאלון.
1. לשנות את תנאי ה-if הראשון לתנאי הזה:
if (a[k] < x) i = k-1; else j = k+1;2. לשנות את תנאי ה-if הראשון לתנאי הזה:
if (a[k] < x) i = k+1; else j = k-1;3. לשנות את תנאי ה-if הראשון לתנאי הזה:
if (a[k] <= x) i = k; else j = k;4. לשנות את תנאי ה-while לתנאי הזה:
while ((a[k] == x) && (i < j));5. אין צורך לשנות כלום. הקוד תקין.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחה862017סמסטר א
★★★★★
חיפוש בינארימערכים
בדקו מה קורה לגבולות
i ו-j כאשר k = i: האם הטווח מצטמצם בהכרח בכל איטרציה? חפשו תיקון שמבטיח שהטווח תמיד יצטמצם ב-לפחות אחד.## ניתוח הבאג בקוד המקורי
הבעיה המרכזית בקוד המקורי היא אפשרות ללולאה אינסופית. נבדוק מה קורה עם
אם
הבאג: כאשר
---
## בדיקת האפשרויות
---
## התשובה הנכונה: אפשרות 2
מדוע זה נכון?
- אם
- אם
- בכל מקרה מצטמצם בקפדנות בכל איטרציה ← אין לולאה אינסופית
שימו לב: אם
הבעיה המרכזית בקוד המקורי היא אפשרות ללולאה אינסופית. נבדוק מה קורה עם
i=0, j=1:אם
a[0] < x, אז מתבצע i = k = 0 — כלומר i לא השתנה! תנאי הלולאה a[k] != x && i < j עדיין מתקיים ← לולאה אינסופית.הבאג: כאשר
i = k (ובאופן סימטרי j = k), הטווח אינו מצטמצם בהכרח.---
## בדיקת האפשרויות
| אפשרות | תיאור | בעיה |
|---|---|---|
| 1 | i = k-1 / j = k+1 | שגוי — מרחיב את הטווח במקום לצמצם |
| 2 | i = k+1 / j = k-1 | ✅ |
| 3 | if (a[k] <= x) i = k; else j = k; | שגוי — עדיין עלולה ללולאה אינסופית כאשר a[k]=x |
| 4 | שינוי תנאי ה-while ל-a[k]==x | שגוי לחלוטין — עוצר רק כשמצא, לא מסיים כשלא מצא |
| 5 | הקוד תקין כמות שהוא | שגוי |
---
## התשובה הנכונה: אפשרות 2
מדוע זה נכון?
- אם
a[k] < x: כל האיברים עד קטנים מ- (המערך ממוין) ← בצדק נעביר - אם
a[k] >= x: ← בצדק נעביר - בכל מקרה מצטמצם בקפדנות בכל איטרציה ← אין לולאה אינסופית
שימו לב: אם
a[k] == x, ה-else יריץ j = k-1, אך אז תנאי ה-while בודק a[k] != x — שהוא שקר, ולכן הלולאה מיד נעצרת וה-k עדיין מצביע על האיבר שנמצא ✓