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.
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!') ______________
Kita sudah tahu sifat identitas perkalian dan pembagian, yaitu dan . 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, jika dan hanya jika , . Maka, jika a atau b berbeda tanda, hasil pembagiannya adalah bilangan bulat negatif terbesar yang kurang dari .
Misalnya: (dengan sisa 2). Tetapi (dengan sisa positif 1).
Definisi relasi rekurens dari kedua operasi tersebut dapat dinyatakan dengan:
Kode program dari kedua fungsi tersebut dapat dilihat pada listing program di atas.
3 votes Thanks 1
4dministraktor
waaaw... tdk pernah setengah2 kakak kalo menjawab ya... terima kasih atas pembelajarannya.
(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 dan . 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:
Maka, jika a atau b berbeda tanda, hasil pembagiannya adalah bilangan bulat negatif terbesar yang kurang dari .
Misalnya: (dengan sisa 2). Tetapi (dengan sisa positif 1).
Definisi relasi rekurens dari kedua operasi tersebut dapat dinyatakan dengan:
Kode program dari kedua fungsi tersebut dapat dilihat pada listing program di atas.
terima kasih atas pembelajarannya.