Berikut ini adalah pertanyaan dari 4dministraktor pada mata pelajaran TI untuk jenjang Sekolah Menengah Atas
1. Rumus suku ke-n (dalam n) dari barisan bilangan
2. Nilai n.
OUTPUT:
n suku pertama dari barisan bilangan yang dimaksud.
BATASAN:
1. Jika terdapat koefisien (konstanta pengali) dari n, contohnya: 5n, maka input harus berupa "5*n", bukan "5n".
2. Rumus harus benar dalam n, maksudnya tidak ada variabel lain selain n.
3. Jenis barisan bilangan (aritmetika, geometri, bertingkat) tidak perlu ditentukan. Yang penting, dapat menampilkan n suku pertama sesuai rumus Un.
4. Tidak menangani barisan bilangan rekursif.
Buatlah program (Python/C++) yang memenuhi spesifikasi di atas. Sertakan listing program dan beberapa contoh hasil eksekusinya.
Jawaban dan Penjelasan
Berikut ini adalah pilihan jawaban terbaik dari pertanyaan diatas.
Kode Program (Python)
# maplambda.py
# oleh: hy
# Menampilkan n suku pertama dari barisan bilangan
# dengan input rumus Un dan n
def validasi_un(un: str) -> str:
# Mengembalikan string rumus Un
# yang sudah divalidasi
# Jika tidak valid, kembalikan
# string "invalid"
un = un.strip().replace('^', '**')
try:
eval(un, {'n':1})
except Exception as ex:
print(f'{un}: Rumus suku ke-n TIDAK VALID.')
return "invalid"
return un
def barisan(un: str, n: int) -> list:
# Mengembalikan list berisi
# barisan bilangan berdasarkan
# rumus suku ke-n (un) yang
# diberikan
return list(map(lambda n: eval(un), range(1, n+1)))
### Program Utama ###
print('\nBARISAN BILANGAN')
un = (input('Input rumus suku ke-n: '))
un_terformat = validasi_un(un)
if (un_terformat != "invalid"):
n = int(input('Input banyak suku (n): '))
if (n > 0):
b = barisan(un_terformat, n)
print('============================')
print(f'-> Un = {un}')
print(f'-> {n} suku pertama: {str(b)[1:-1]}')
else:
print('n = {n}: Nilai n TIDAK VALID.')
### Akhir Program Utama ###
_____________
Pembahasan
Untuk menyelesaikan persoalan ini, saya memilih menggunakan Python, karena pada Python terdapat fungsi lambdadanmap(), yang dapat menghasilkan nilai sesuai rumus pada lambda.
Contoh penggunaannya adalah sebagai berikut.
- Misalkan: f(x) = x + 2, dan x = 3.
>>> list(map(lambda x: x + 2, [3]))
[5] - Misalkan: f(x) = x + 2, dan x = 1, 2, 3, 4, 5.
>>> list(map(lambda x: x + 2, [1, 2, 3, 4, 5]))
[3, 4, 5, 6, 7] - Dan seterusnya.
Kemudian, pada Python, juga terdapat fungsi eval() yang dapat mengevaluasi operasi aritmetika sesuai rumus dalam bentuk string (teks).
Contoh penggunaannya adalah sebagai berikut.
>>> eval("x + 2", {"x": 3})
5
>>> x = 100; eval("x - 2")
98
>>> eval("x + y + z", {"x": x, "y": 20, "z": 30})
150
Jadi, abstraksi rumus suku ke-n barisan bilangan dapat dilakukan dengan memanfaatkan map(), lambda, dan eval(). Fungsi eval() digunakan untuk menginterpretasikan rumus suku ke-n dalam bentuk string dari input.
Maka, jadilah fungsi barisan() seperti pada program di atas, yaitu:
def barisan(un: str, n: int) -> list:
return list(map(lambda n: eval(un), range(1, n+1)))
Hanya 1 baris! Sederhana ya?
Contoh Hasil Eksekusi
- Input tidak valid
BARISAN BILANGAN
Input rumus suku ke-n: 2n+3
2n+3: Rumus suku ke-n TIDAK VALID.
- Input: Un = 4*n + 3 (barisan aritmetika 7, 11, 15, 19, ...)
BARISAN BILANGAN
Input rumus suku ke-n: 4*n + 3
Input banyak suku (n): 10
============================
-> Un = 4*n + 3
-> 10 suku pertama: 7, 11, 15, 19, 23, 27, 31, 35, 39, 43
- Input: Un = 2^(n-1) (barisan geometri 1, 2, 4, 8, ...)
BARISAN BILANGAN
Input rumus suku ke-n: 2^(n-1)
Input banyak suku (n): 10
============================
-> Un = 2^(n-1)
-> 10 suku pertama: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
- Input: Un = 4*n^2 + 3*n + 2 (barisan aritmetika tingkat 2)
BARISAN BILANGAN
Input rumus suku ke-n: 4*n^2 + 3*n + 2
Input banyak suku (n): 10
============================
-> Un = 4*n^2 + 3*n + 2
-> 10 suku pertama: 9, 24, 47, 78, 117, 164, 219, 282, 353, 432
- Input: n^3 + 2*n (barisan aritmetika tingkat 3)
BARISAN BILANGAN
Input rumus suku ke-n: n^3 + 2*n
Input banyak suku (n): 10
============================
-> Un = n^3 + 2*n
-> 10 suku pertama: 3, 12, 33, 72, 135, 228, 357, 528, 747, 1020
(dapat juga dilihat pada gambar)
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: Fri, 11 Nov 22