Menu
Coddy logo textTech

מבנה רקורסיבי

שיעור 9 מתוך 29 בקורס פרויקט מחשבון באמצעות Python של Coddy.

העוצמה האמיתית של המבנה שראינו בשיעור הקודם מתגלה באמצעות רקורסיה.

נבחן חישוב עם יותר מאופרטור אחד, לדוגמה:

  • 2 + 3 * 4 + 5

לפי כללי המתמטיקה יש סדר פעולות: תחילה עלינו לחשב 3 * 4, ואז את כל השאר.

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

  • ['+', ['+', 2, ['*', 3, 4]], 5]
  • ['+', 2, ['+', 5, ['*', 3, 4]]]
  • ['+', 5, ['+', ['*', 3, 4], 2]]

שימו לב שהמבנה הפשוט העמוק ביותר הוא תמיד ['*', 3, 4], שאותו מחשבים ראשון. שימו לב גם שהכול בנוי מהמבנה הבסיסי [op, num1, num2]. 

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

  • 2 - 3  ->  ['-', 2, 3]
  • 1 - 2 + 3  ->  ['+', ['-', 1, 2], 3]
  • 1 * 2 - 3  ->  ['-', ['*', 1, 2], 3]
  • 2.3 + 3 / 4.2 - 2  ->  ['-', ['+', 2.3, ['/', 3, 4.2]], 2]
challenge icon

אתגר

בינוני

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

הערות:

  • קראו לפונקציה calc כאשר המבנה פשוט: אופרטור עם שני מספרים .
  • קראו ל-eval באופן רקורסיבי אם אחד הארגומנטים הוא מבנה אחר (רשימה).

נסו בעצמכם

def calc(op, n1, n2=None):
    if not isinstance(n1, int) and not isinstance(n1, float):
        raise Exception('Invalid number "' + str(n1) + '"')

    if n2 is None:
        if op == '+' or op == 'add':
            return n1
        if op == '-' or op == 'sub':
            return -n1

        raise Exception('Invalid operator "' + op + '"')

    if not isinstance(n2, int) and not isinstance(n2, float):
        raise Exception('Invalid number "' + str(n2) + '"')

    if op == '+' or op == 'add':
        return n1 + n2
    if op == '-' or op == 'sub':
        return n1 - n2
    if op == '*' or op == 'mul':
        return n1 * n2
    if op == '/' or op == 'div':
        if n2 == 0:
            raise Exception("Division by zero")
        return n1 / n2
    if op == '%' or op == 'mod':
        if n2 == 0:
            raise Exception("Division by zero")
        return n1 % n2
    if op == '^' or op == 'pow':
        return n1 ** n2

    raise Exception('Invalid operator "' + op + '"')


def eval(lst):
    op = lst[0]
    n1 = lst[1]
    n2 = lst[2]
    return calc(op, n1, n2)

כל השיעורים ביחידה פרויקט מחשבון באמצעות Python

תרגלו בעצמכם: קומפיילר Python אונליין