Dua indeks sekaligus

Loop di dalam loop, dan indeks dalam yang dimulai ulang setiap kali yang luar melangkah.

Sebaiknya baca lebih dulu: Berhenti tanpa tahu berapa kali.

Membaca papan catur

Itulah satu satunya hal baru pada loop bersarang: indeks dalam dimulai ulang setiap kali indeks luar melangkah. Nilai awalnya berada di dalam loop luar, tepat seperti akumulator per kelompok pada pelajaran 1.4.

SET baris = 0
WHILE baris < LENGTH(grid)
  SET kolom = 0
  WHILE kolom < LENGTH(grid[baris])
    // di sini grid[baris][kolom] dapat dibaca
    SET kolom = kolom + 1
  END
  SET baris = baris + 1
END
Baris ketiga yang menjadi kuncinya: nilai awal kolom ada DI DALAM loop baris, jadi ia kembali ke nol setiap baris.

IngatPanjang setiap baris dibaca dari baris itu sendiri, bukan dari baris pertama. Grid tidak selalu persegi.

Diagonal, dan kenapa satu indeks cukup

Sekarang soal yang sesungguhnya: mengumpulkan nilai pada posisi yang nomor barisnya sama dengan nomor kolomnya. Petak nol nol, satu satu, dua dua, dan seterusnya. Perhatikan bahwa untuk diagonal, kedua indeksnya selalu bernilai sama, jadi loop dalamnya sebenarnya tidak diperlukan sama sekali.

Bersarang, memeriksa setiap petak

WHILE baris < LENGTH(grid)
  SET kolom = 0
  WHILE kolom < LENGTH(grid[baris])
    IF baris == kolom
      SET hasil = hasil + [grid[baris][kolom]]
    END
    SET kolom = kolom + 1
  END
  SET baris = baris + 1
END

Satu loop, indeks dipakai dua kali

WHILE baris < LENGTH(grid)
  IF baris < LENGTH(grid[baris])
    SET hasil = hasil + [grid[baris][baris]]
  END
  SET baris = baris + 1
END

Keduanya menghasilkan jawaban yang sama. Kolom kiri memeriksa seluruh petak untuk menemukan yang segelintir, dan pada grid seratus kali seratus itu berarti sepuluh ribu pemeriksaan untuk seratus jawaban. Kolom kanan langsung menunjuk petaknya. Yang membuatnya mungkin satu pengamatan: pada diagonal, nomor baris dan nomor kolom adalah angka yang sama.

Perhatikan baris kedua kolom kanan. Pemeriksaan itu bukan hiasan: ia yang menangani baris yang lebih pendek daripada nomor barisnya sendiri.

Grid yang tidak persegi

Grid dengan baris yang panjangnya berbeda adalah keadaan biasa, bukan keadaan aneh. Baris ketiga yang hanya berisi dua elemen tidak punya petak pada kolom ketiga, jadi ia tidak menyumbang apa pun ke diagonal. Bukan nol, bukan galat, melainkan tidak ada.

SET hasil = []
SET baris = 0
WHILE baris < LENGTH(grid)
  IF baris < LENGTH(grid[baris])
    SET hasil = hasil + [grid[baris][baris]]
  END
  SET baris = baris + 1
END
baris0
hasil[]

Grid berisi [1, 2, 3], lalu [4, 5, 6], lalu [7, 8]. Baris terakhir lebih pendek.

Langkah 1 dari 7
Grid tiga baris, dengan baris terakhir hanya berisi dua elemen. Perhatikan baris ke tiga dilewati tanpa menyumbang apa pun.

Tanpa pemeriksaan panjang baris, langkah keenam tadi akan membaca grid[2][2] yang tidak ada, dan kita kembali ke persoalan pelajaran sebelumnya: indeks yang melewati ujung. Dua pelajaran ini bersaudara, dan bentuk kesalahannya sama.

Periksa pemahaman

Grid berisi satu baris dengan satu elemen, yaitu [[5]]. Apa hasil diagonalnya?

Ringkasan

  • Indeks dalam dimulai ulang setiap kali indeks luar melangkah, dan nilai awalnya berada di dalam loop luar.
  • Panjang setiap baris dibaca dari baris itu sendiri. Grid tidak selalu persegi.
  • Pada diagonal, nomor baris dan nomor kolom adalah angka yang sama, jadi satu loop sudah cukup.
  • Baris yang lebih pendek daripada nomor barisnya tidak menyumbang apa pun, bukan menyumbang nol.
  • Tanpa pemeriksaan panjang baris, persoalannya kembali menjadi indeks yang melewati ujung.