Menu
CoddyTech

Struktur rekursif

Pelajaran 9 dari 29 dalam kursus Proyek kalkulator dengan Python di Coddy.

Kekuatan sebenarnya dari struktur yang kita lihat pada pelajaran sebelumnya hadir bersama rekursi.

Pertimbangkan perhitungan dengan lebih dari satu operator, misalnya:

  • 2 + 3 * 4 + 5

Urutannya mengikuti aturan matematika. Pertama, kita perlu menghitung 3 * 4, lalu sisanya.

Perhitungan berikut dapat disusun menjadi struktur rekursif dengan beberapa cara berikut:

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

Perhatikan bahwa struktur sederhana yang paling dalam selalu ['*', 3, 4], yang dihitung pertama. Perhatikan juga bahwa semuanya menggunakan struktur dasar [op, num1, num2]. 

Beberapa contoh perhitungan lainnya dalam bentuk struktur rekursif:

  • 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

Tantangan

Sedang

Tingkatkan fungsi eval agar mendukung struktur rekursif seperti yang dijelaskan di atas.

Catatan:

  • Panggil fungsi calc jika strukturnya sederhana, yaitu operator dengan dua angka .
  • Panggil eval secara rekursif jika salah satu argumennya adalah struktur lain (list).

Coba sendiri

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)

Semua pelajaran di Proyek kalkulator dengan Python

Latihan sendiri: Compiler Python online