20. Pola-pola perulangan
Hampir semua perulangan punya salah satu dari empat bentuk. Kalau kamu sudah hafal keempat bentuk itu, kamu tidak perlu menciptakan logika perulangan dari awal setiap kali — tinggal pilih yang paling cocok. Keempatnya adalah akumulasi, penghitungan, pencarian, dan penanda, masing-masing punya satu tugas kecil. Contoh-contohnya memakai rentang angka, tapi bentuk-bentuk ini berlaku untuk apapun yang bisa kamu iterasi.
1. Akumulasi — membangun hasil secara bertahap
Pegang sebuah variabel dan ubah nilainya di setiap putaran. Kasus paling klasik adalah menjumlahkan total:
local sum = 0
for i = 1, 10 do
sum = sum + i
end
print(sum) -- 55Bentuknya selalu sama: tentukan nilai awal sebelum
perulangan, perbarui di dalam, lalu gunakan sesudah.
Pola ini juga bisa membangun string (mulai dari "", sambung
potongan di setiap putaran) dan mencari nilai maksimum (mulai dari nilai
rendah, naikkan kalau kamu menemukan yang lebih besar).
2. Penghitungan — berapa banyak yang cocok?
Penghitung adalah akumulator yang bertambah satu, tapi hanya ketika sebuah tes berhasil. "Berapa banyak angka dari 1 sampai 30 yang habis dibagi 3?"
local hits = 0
for i = 1, 30 do
if i % 3 == 0 then
hits = hits + 1
end
end
print(hits) -- 10if di dalam perulangan adalah tesnya;
hits = hits + 1 adalah pencacahnya.
3. Pencarian — temukan kecocokan pertama lalu berhenti
Kalau kamu hanya butuh nilai pertama yang sesuai, gunakan
break begitu kamu menemukannya — tidak ada gunanya terus
berjalan:
local first
for i = 1, 100 do
if i * i > 50 then
first = i
break
end
end
print(first) -- 8 (because 8 × 8 = 64, the first square over 50)first dimulai sebagai nil. Kalau tidak ada
yang cocok, nilainya tetap nil — jawaban "tidak ditemukan"
yang praktis dan bisa kamu tes dengan if.
4. Penanda — apakah ada putaran yang cocok?
Kadang kamu hanya butuh ya/tidak, bukan nilainya: "apakah ada angka
dari 1 sampai 20 yang habis dibagi 7?" Simpan sebuah boolean yang
dimulai dari false dan berubah jadi true
begitu kamu menemukan kecocokan:
local found = false
for i = 1, 20 do
if i % 7 == 0 then
found = true
end
end
print(found) -- true (7 and 14 are in range)Kalau kamu hanya peduli apakah ada yang cocok, tambahkan
break saat penanda berubah — itu mengubahnya menjadi
pencarian. Penanda dan pencarian adalah sepupu.
Buka exercises/20/01-patterns.lua. Di sana sudah ada
kode yang mengakumulasi jumlah 1 sampai 20. Tambahkan pola penghitungan
di bawahnya untuk mencetak berapa banyak angka dalam rentang itu yang
genap.
Menggabungkan pola-pola
Program nyata menggabungkan pola-pola ini. Satu kali jalan bisa mengakumulasi total, menghitung berapa yang memenuhi aturan, dan menandai apakah sesuatu yang spesial muncul, semuanya sekaligus:
local total = 0
local evens = 0
local has_multiple_of_5 = false
for i = 1, 10 do
total = total + i -- accumulate
if i % 2 == 0 then evens = evens + 1 end -- count
if i % 5 == 0 then has_multiple_of_5 = true end -- flag
end
print("total", total) -- 55
print("evens", evens) -- 5
print("multiple of 5?", has_multiple_of_5) -- trueSatu perulangan, tiga pola, tiga jawaban.
PR
File PR ada di exercises/20/homework/.
Soal 1 — Faktorial
Buka exercises/20/homework/01-product.lua. Gunakan pola
akumulasi untuk mengalikan angka 1 sampai 5 bersamaan, lalu cetak
hasilnya. (Petunjuk: hasil kali dimulai dari 1, bukan
0 — apapun dikali nol hasilnya nol.)
Soal 2 — Hitung kelipatan
Buka exercises/20/homework/02-count-multiples.lua.
Gunakan pola penghitungan untuk mencetak berapa banyak angka dari 1
sampai 50 yang habis dibagi 7.
Soal 3 — Kuadrat besar pertama
Buka exercises/20/homework/03-first-big.lua. Gunakan
pola pencarian untuk menemukan dan mencetak angka pertama yang
kuadratnya lebih dari 200, periksa mulai dari 1 ke atas dan berhenti
dengan break.
Tantangan — Statistik rentang dalam satu jalan
Buka exercises/20/homework/04-stats.lua. Dalam satu
perulangan dari 1 sampai 20, hitung dan cetak tiga hal: totalnya
(akumulasi), berapa yang genap (penghitungan), dan apakah ada angka yang
habis dibagi 9 (penanda).
Macet atau sudah selesai? Buka halaman solusi PR.