טיפ למתחילים: טבלת מעקב

הי,

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

ניקח לדוגמא את התוכנית הבאה שאמורה להדפיס את האיברים של סידרת פיבונאצ׳י. סידרת פיבונאצ׳י היא סידרה שבה כל איבר הוא סכום שני האיברים שבאים לפניו (מתחילים עם 0 ו-1) כלומר המספרים:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ...

נניח שכתבנו את הקוד הבא כדי להדפיס את 4 המספרים הראשונים בסידרה:

x = 0
y = 0

for i in range(4):
    print(y)
    x = y
    y = x + y

אנחנו חושבים שהקוד שומר במשתנים x ו y את שני האיברים האחרונים שחישב בסידרה וכל פעם מדפיס את y ומקדם את x ו-y למספרים הבאים. כלומר אני חושב שלאורך ריצת התוכנית ערכי המשתנים יהיו:

איטרציה מספר שורה i x y
0 5 0 0 1
1 5 1 1 2
2 5 2 3 5
3 5 3 8 13

עכשיו אפשר לחזור לתוכנית ולהוסיף הודעת הדפסה בדיוק לפני שורה מספר 5 עבור הערכים של i, x ו y כדי לראות אם אכן ערכים אלה תואמים למה שאנחנו חושבים שהם צריכים להיות. אין טעם להדפיס את המספרים האמיתיים הם רק יבלבלו אותנו ולכן התוכנית לאחר השינוי נראית כך:

x = 0
y = 1

for i in range(10):
    print("--- DEBUG x = {}, y = {}, i = {}".format(x, y, i))
    # print(y)
    x = y
    y = x + y

לאחר הרצה נקבל:

--- DEBUG x = 0, y = 1, i = 0
--- DEBUG x = 1, y = 2, i = 1
--- DEBUG x = 2, y = 4, i = 2
--- DEBUG x = 4, y = 8, i = 3
--- DEBUG x = 8, y = 16, i = 4
--- DEBUG x = 16, y = 32, i = 5
--- DEBUG x = 32, y = 64, i = 6
--- DEBUG x = 64, y = 128, i = 7
--- DEBUG x = 128, y = 256, i = 8
--- DEBUG x = 256, y = 512, i = 9

עכשיו אנחנו יודעים איפה הבעיה מתחילה: כש i הוא 2 אז x יצא לנו 2 אבל היה צריך להיות 3 ו y יצא 4 אבל היה צריך להיות 5. הפעם הקודמת ששינינו את הערכים של x ו y היתה באיטרציה הקודמת ולכן אנחנו יודעים שהבעיה בקוד:

    x = y
    y = x + y

כאשר לפני הרצת הקוד הערך של x הוא 1 כמו בטבלא והערך של y הוא 2. מסתבר שבאמת כשאנחנו מריצים את הקוד בדימיון קל לראות שיש טעות בחישוב ולתקן אותה.