19. Perulangan bersarang
Perulangan mengulang sebuah blok. Bagaimana kalau blok itu berisi perulangan lain? Itulah perulangan bersarang: perulangan dalam berjalan penuh pada setiap putaran perulangan luar. Perulangan bersarang membuat kisi, tabel, dan apa pun yang punya baris dan kolom.
Perulangan di dalam perulangan
Taruh satu for di dalam for lain.
Perulangan dalam selesai sebelum perulangan luar bergerak:
for outer := 1; outer <= 3; outer++ {
for inner := 1; inner <= 2; inner++ {
fmt.Println(outer, inner)
}
}Output:
1 1
1 2
2 1
2 2
3 1
3 2
Ikuti urutannya. Selama outer bernilai 1,
perulangan dalam berjalan (1, 2). Lalu
outer menjadi 2 dan perulangan dalam berjalan
lagi. Itu 3 × 2 = 6 kali jalan.
Beri kedua variabel perulangan nama yang berbeda.
row/col atau i/j
adalah pasangan yang umum. Memakai i untuk keduanya bisa
dikompilasi, tetapi i di dalam adalah variabel baru yang
menyembunyikan i di luar, sehingga di dalam perulangan
dalam kamu tidak bisa membaca hitungan luar:
for i := 1; i <= 2; i++ {
for i := 1; i <= 2; i++ {
fmt.Println("inner", i)
}
fmt.Println("outer", i)
}Output:
inner 1
inner 2
outer 1
inner 1
inner 2
outer 2
Membangun satu baris sekaligus
Satu nilai per baris jarang cocok untuk kisi. Trik yang biasa:
perulangan luar menangani baris; perulangan
dalam membangun satu string, yang dicetak ketika
barisnya selesai. += menambah ke string, dan
strconv.Itoa dari Bab 14 mengubah setiap angka menjadi
teks:
for row := 1; row <= 3; row++ {
line := ""
for col := 1; col <= 3; col++ {
line += strconv.Itoa(row*col) + "\t"
}
fmt.Println(line)
}Output (kisi perkalian 3×3):
1 2 3
2 4 6
3 6 9
Perhatikan line := "" berada di dalam
perulangan luar tetapi di luar perulangan dalam. Ia diatur
ulang setiap baris, terisi di perulangan dalam, lalu dicetak.
"\t" dari Bab 12 menaruh tab setelah setiap angka, yang
membuat kolomnya sejajar.
Buka exercises/19/01-grid.go. File ini mencetak kisi
3×3. Ubah hanya dua nilai akhirnya untuk membuatnya 5×5.
Segitiga dengan perulangan dalam yang berubah
Kondisi perulangan dalam bisa bergantung pada variabel luar. Jalankan
dari 1 sampai row dan kamu mendapat
segitiga:
for row := 1; row <= 4; row++ {
line := ""
for star := 1; star <= row; star++ {
line += "*"
}
fmt.Println(line)
}Output:
*
**
***
****
Baris 1 menjalankan perulangan dalam sekali; baris 4 menjalankannya empat kali. Bentuknya datang dari hitungannya.
strings.Repeat("*", row) dari Bab 14 bisa membangun
setiap baris dalam satu panggilan. Menulis perulangannya sendiri adalah
latihannya di sini, dan banyak kisi punya baris yang tidak bisa dibangun
strings.Repeat, seperti kisi perkalian di atas.
Berapa kali isi perulangan berjalan?
Kalikan hitungannya. Perulangan luar 10 di sekitar perulangan dalam
10 menjalankan isinya 10 × 10 = 100 kali. Jumlah ini cepat
membesar: tiga perulangan masing-masing 100 berarti satu juta kali
jalan. Komputer menangani sejuta langkah sederhana dengan cepat, tetapi
hitungannya layak diperiksa sebelum kamu menambah satu tingkat lagi.
PR
Starter PR ada di exercises/19/homework/. Setiap starter
bisa langsung dijalankan dan mencetak satu baris pengganti.
Soal 1 — Persegi panjang dari tanda pagar
Buka exercises/19/homework/01-rectangle.go. Dengan
perulangan bersarang, cetak persegi panjang dari # selebar
5 dan setinggi 3:
#####
#####
#####
Soal 2 — Pasangan koordinat
Buka exercises/19/homework/02-coords.go. Cetak setiap
pasangan (x, y) untuk x dan y
dari 1 sampai 3, satu per baris: (1, 1),
(1, 2), dan seterusnya. Sembilan baris.
Soal 3 — Tabel perkalian
Buka exercises/19/homework/03-times-table.go. Cetak kisi
perkalian lengkap dari 1×1 sampai 5×5: lima
baris berisi masing-masing lima angka, dengan tab setelah setiap
angka.
Tantangan — Segitiga siku-siku
Buka exercises/19/homework/04-triangle.go. Cetak
segitiga siku-siku dari * setinggi 6 baris, dengan baris
n berisi n bintang. Sebagai tambahan, balik
segitiganya (6 bintang di baris pertama, 1 di baris terakhir).
Stuck atau sudah selesai? Buka halaman solusi PR.