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.