Fungsi Rekursif (2/2) 1. Definisikanlah operasi PERKALIAN dan PEMBAGIAN bilangan bulat

Berikut ini adalah pertanyaan dari 4dministraktor pada mata pelajaran TI untuk jenjang Sekolah Menengah Atas

Fungsi Rekursif (2/2)1. Definisikanlah operasi PERKALIAN dan PEMBAGIAN bilangan bulat sebagai relasi rekurens dalam bentuk notasi fungsional (notasi matematis).
2. Buatlah program (C/C++/Python) yang mengimplementasikan kedua relasi rekurens tersebut dalam bentuk fungsi rekursif, dan lakukan test dengan beberapa kasus.

Jawaban dan Penjelasan

Berikut ini adalah pilihan jawaban terbaik dari pertanyaan diatas.

(Jawaban soal nomor 1 ada di bagian Pembahasan.)

Kode Program (Python)

import random

def kali(a, b) -> int:
   if a == 0 or b == 0:
       return 0
   if a == 1:
       return b
   if b == 1:
       return a
   if a < 0 and b < 0:
       return kali(abs(a), abs(b))
   if a > 0 and b < 0:
       return kali(b, a)
   return a + kali(a, b - 1)

def bagi(a, b):
   a_abs, b_abs = abs(a), abs(b)
   if b == 0:
       return 'tak terdefinisi'
   if (a >= 0 and b > 0) or (a < 0 and b < 0):
       # pencabangan untuk hasil positif
       if a_abs < b_abs:
           return 0
       else:
           return 1 + bagi(a_abs - b_abs, b_abs)
   if (a < 0 and b >0) or (a > 0 and b < 0):
       # pencabangan untuk hasil negatif
       if a_abs <= b_abs:
           return -1
       else:
           return -1 + bagi(a_abs - b_abs, -b_abs)

### Program Utama - test
print('\nUJI PERKALIAN REKURSIF')
try:
   for i in range(0, 10):
       a, b = random.randint(-99, 99), random.randint(-99, 99)
       print(f'Menguji: kali({a}, {b}) == {a} * {b} ...')
       assert kali(a, b) == a * b
except AssertionError:
   # Terdapat kesalahan
   print('=> Terdapat kesalahan dalam pengujian.')
   print('=> Definisi fungsi kali() salah!')
else:
   # Tidak ada kesalahan
   print('=> Tidak ditemukan kesalahan dalam pengujian.')
   print('=> Definisi fungsi kali() benar!')
print('---------------------')
print('UJI PEMBAGIAN (DIV) REKURSIF')
try:
   for i in range(0, 10):
       a, b = random.randint(-99, 99), random.randint(-99, 99)
       print(f'Menguji: bagi({a}, {b}) == {a} // {b} ...')
       assert bagi(a, b) == a // b
except AssertionError:
   # Terdapat kesalahan
   print('=> Terdapat kesalahan dalam pengujian.')
   print('=> Definisi fungsi bagi() salah!')
else:
   # Tidak ada kesalahan
   print('=> Tidak ditemukan kesalahan dalam pengujian.')
   print('=> Definisi fungsi bagi() benar!')
______________

Output Hasil Eksekusi (Pengujian)

UJI PERKALIAN REKURSIF
Menguji: kali(88, 54) == 88 * 54 ...
Menguji: kali(-19, 29) == -19 * 29 ...
Menguji: kali(-78, -10) == -78 * -10 ...
Menguji: kali(-2, -49) == -2 * -49 ...
Menguji: kali(42, 82) == 42 * 82 ...
Menguji: kali(96, 88) == 96 * 88 ...
Menguji: kali(62, -32) == 62 * -32 ...
Menguji: kali(34, 81) == 34 * 81 ...
Menguji: kali(46, 73) == 46 * 73 ...
Menguji: kali(22, 37) == 22 * 37 ...
=> Tidak ditemukan kesalahan dalam pengujian.
=> Definisi fungsi kali() benar!
---------------------
UJI PEMBAGIAN (DIV) REKURSIF
Menguji: bagi(-59, -86) == -59 // -86 ...
Menguji: bagi(34, -39) == 34 // -39 ...
Menguji: bagi(59, 19) == 59 // 19 ...
Menguji: bagi(-68, -30) == -68 // -30 ...
Menguji: bagi(33, -8) == 33 // -8 ...
Menguji: bagi(66, -71) == 66 // -71 ...
Menguji: bagi(36, 34) == 36 // 34 ...
Menguji: bagi(-21, -49) == -21 // -49 ...
Menguji: bagi(79, -37) == 79 // -37 ...
Menguji: bagi(-21, 92) == -21 // 92 ...
=> Tidak ditemukan kesalahan dalam pengujian.
=> Definisi fungsi bagi() benar!
______________

Pembahasan

Kita sudah tahu sifat identitas perkalian dan pembagian, yaitu a \times 1 = adana \div 1 = a. Namun, perlu diingat lagi bahwa operasi aritmetika pembagian tidak bersifat tertutup, karena dapat menghasilkan bilangan rasional, yang tentunya di luar himpunan bilangan bulat.

Oleh karena itu, menurut saya, batasan dari operasi pembagian pada pertanyaan adalah pembagian yang menghasilkan bilangan bulat, tanpa memperhitungkan sisa pembagian jika pembagi tak habis membagi bilangan yang dibagi.

Beberapa hal yang perlu diperhatikan pada operasi pembagian bilangan bulat (div) adalah:

  • Pembagian tak terdefinisi jika pembagi = 0.
  • Sesuai teorema faktor dan sisa pembagian, a \div b = cjika dan hanya jikaa = bc + r, r \ge 0.
    Maka, jika a atau b berbeda tanda, hasil pembagiannya adalah bilangan bulat negatif terbesar yang kurang dari a/b.

Misalnya: 2 \div 3 = 0 (dengan sisa 2). Tetapi -2 \div 3 = -1 (dengan sisa positif 1).

Definisi relasi rekurens dari kedua operasi tersebut dapat dinyatakan dengan:

\begin{aligned}{\tt kali}(a,b)=\begin{cases}0\,,&{\rm jika\ }a=0\ {\rm atau\ }b=0\\a\,,&{\rm jika\ }b=1\\b\,,&{\rm jika\ }a=1\\{\tt kali}(|a|,|b|)\,,&{\rm jika\ }a < 0\ {\rm dan\ }b < 0\\{\tt kali}(b,a)\,,&{\rm jika\ }a > 0\ {\rm dan\ }b < 0\\a+{\tt kali}(a,b-1)\,,\!\!\!&{\rm jika\ }a > 0\ {\rm dan\ }b > 0\\\end{cases}\end{aligned}

\begin{aligned}{\tt bagi}(a,b)=\begin{cases}\vphantom{\Big|}\text{tak terd{ef}inisi}\,,&{\rm jika\ }b=0\\0\,,&{\rm jika\ }{\tt kali}(a,b) \ge 0\\&{\rm dan\ }|a| < |b|\\1+{\tt bagi}(|a|-|b|,|b|)\,,&{\rm jika\ }{\tt kali}(a,b) \ge 0\\&{\rm dan\ }|a| \ge |b|\\-1\,,&{\rm jika\ }{\tt kali}(a,b) < 0\\&{\rm dan\ }|a| \le |b|\\-1+{\tt bagi}(|a|-|b|,-|b|)\,,\!&{\rm jika\ }{\tt kali}(a,b) < 0\\&{\rm dan\ }|a| > |b|\\\end{cases}\end{aligned}

Kode program dari kedua fungsi tersebut dapat dilihat pada listing program di atas.

Semoga dengan pertanyaan yang sudah terjawab oleh henriyulianto dapat membantu memudahkan mengerjakan soal, tugas dan PR sekolah kalian.

Apabila terdapat kesalahan dalam mengerjakan soal, silahkan koreksi jawaban dengan mengirimkan email ke yomemimo.com melalui halaman Contact

Last Update: Wed, 16 Nov 22