בבחינת הבגרות במדעי המחשב חוזרים כמה סוגי שאלות: מעקב אחרי קטע קוד, כתיבת פונקציה לפי דרישה, ניתוח סיבוכיות, ושאלה על מבנה נתונים כמו מחסנית, תור או רשימה דו-ממדית. כאן כל הבעיות מקוריות, בסגנון הבחינה, עם פתרון לדוגמה שאפשר להריץ שורה אחרי שורה. כדאי לחזור גם על רקורסיה ועל רשימות דו-ממדיות.
לכל שאלה עובדים באותם חמישה צעדים:
מסמנים מה הפונקציה מקבלת ומה היא מחזירה. מחזירה, לא מדפיסה. אחר כך כותבים 2 או 3 דוגמאות קטנות, כולל מקרה קצה: רשימה ריקה, איבר אחד, ערך שלא קיים.
במשפט אחד: "עוברים על כל איבר, ובודקים…". רק אחר כך קוד. שמות משתנים ברורים, הזחה מסודרת, ו-return בסוף כל מסלול.
מריצים את הקוד בראש על הדוגמאות עם טבלת מעקב: עמודה לכל משתנה, שורה לכל צעד. אם התוצאה לא כמו בדוגמה, מוצאים את השורה שבה זה השתבש.
בחרו בעיה במחוון הראשון ואת הקלט במחוון השני. קראו את הדרישה, נחשו את התשובה, ורק אז הריצו את הפתרון לדוגמה שורה אחרי שורה.
נסו את אלה:
אפשר לשנות את הקוד ולהריץ פייתון אמיתי. בפעם הראשונה הטעינה לוקחת כמה שניות.
"כתבו פונקציה שמחזירה" פירושו return. פונקציה שמדפיסה מחזירה None, ומי שקרא לה לא יכול להשתמש בתוצאה.
✗ לא נכון
print(count)✓ נכון
return countכשבודקים שכנים nums[i + 1], הלולאה חייבת לעצור איבר אחד לפני הסוף.
✗ לא נכון
for i in range(len(nums)):✓ נכון
for i in range(len(nums) - 1):"אם לא מצאנו, החזירו False" צריך לבוא אחרי הלולאה. בתוך הלולאה הוא עוצר כבר באיבר הראשון.
✗ לא נכון
for x in nums:
if x == t:
return True
else:
return False✓ נכון
for x in nums:
if x == t:
return True
return Falseלפני pop() בודקים שהמחסנית לא ריקה. אחרת התוכנית נעצרת בשגיאה.
✗ לא נכון
stack.pop()✓ נכון
if len(stack) == 0:
return False
stack.pop()מתרגלים כל יום קצת מכל סוג שאלה: מעקב, כתיבת פונקציה, סיבוכיות ומבני נתונים. פותרים על דף, בלי מחשב, כמו בבחינה, ורק אחר כך בודקים בהרצה. עובדים תמיד באותה שיטה: דרישה, דוגמאות, תכנון, קוד, מעקב. נסו במעבדה.
פותחים עמודה לכל משתנה ועמודה לפלט. בכל פעם ששורה משנה משתנה, כותבים את הערך החדש בשורה חדשה בטבלה. בלולאות כותבים גם את תנאי הלולאה ואם הוא נכון. בסוף, הערך האחרון בכל עמודה הוא הערך הסופי.
סופרים כמה פעמים השורה הפנימית ביותר רצה, כפונקציה של גודל הקלט n. לולאה אחת על n איברים היא O(n). לולאה בתוך לולאה היא בדרך כלל O(n²). לולאה שחוצה את n בכל סיבוב היא O(log n). תרגלו למטה.