Berikut ini adalah pertanyaan dari 4dministraktor pada mata pelajaran TI untuk jenjang Sekolah Menengah Atas
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 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.
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