Menolak loop yang tidak berhenti

Kadang jawaban yang benar bukan menghitung, melainkan menyatakan bahwa perhitungannya tidak akan pernah selesai.

Sebaiknya baca lebih dulu: Berhenti tanpa tahu berapa kali, Menolak lebih dulu, baru menghitung.

Menuruni tangga dengan langkah nol

Loop yang tidak pernah berhenti hampir selalu punya satu bentuk yang sama: nilai yang dipakai kondisinya ternyata tidak bergerak menuju berhentinya. Pelajaran 3.1 memperlihatkan bentuk pertamanya, yaitu kenaikan yang lupa ditulis. Di sini bentuk kedua, yang lebih sulit dilihat: langkahnya ada, tetapi besarnya nol.

IngatLoop berhenti hanya bila nilai yang diperiksa kondisinya benar benar bergerak. Langkah nol dan langkah yang arahnya berlawanan sama sama tidak menggerakkannya.

Dua langkah yang tidak menggerakkan

Pertanyaannya berapa kali sebuah nilai harus dikurangi langkah sampai habis. Ada dua nilai langkah yang membuat pertanyaan itu tidak punya jawaban, dan keduanya perlu ditolak.

  • Langkah nol: nilainya tidak berubah sama sekali. Sepuluh dikurangi nol tetap sepuluh, selamanya.
  • Langkah negatif: nilainya justru bertambah. Sepuluh dikurangi negatif dua menjadi dua belas, lalu empat belas, menjauh dari nol alih alih mendekatinya.
  • Keduanya dijawab negatif satu, yaitu penanda bahwa perhitungannya tidak mungkin, bukan nol dan bukan galat.

Langkah negatif itu yang paling sering luput. Kodenya terlihat benar, operasinya pengurangan, dan pada nilai langkah positif ia bekerja sempurna. Kegagalannya hanya muncul pada masukan tertentu, dan justru masukan itu yang paling jarang diuji.

Penjaga di depan, bukan tambalan di dalam

Ditambal dengan batas putaran

SET langkah = 0
WHILE start > 0 AND langkah < 10000
  SET start = start - step
  SET langkah = langkah + 1
END
OUTPUT langkah

Ditolak di baris terdepan

IF step <= 0
  OUTPUT -1
END
SET langkah = 0
WHILE start > 0
  SET start = start - step
  SET langkah = langkah + 1
END
OUTPUT langkah

Kolom kiri memang berhenti, dan itu yang membuatnya berbahaya. Ia mengeluarkan 10000 sebagai jawaban, angka yang tampak seperti hasil perhitungan padahal sebenarnya pengakuan bahwa perhitungannya gagal. Batas putaran menyembunyikan pertanyaan yang salah alih alih menjawabnya. Kolom kanan menyatakan ketidakmungkinannya sebagai jawaban, dan angka negatif satu tidak dapat disalahartikan sebagai jumlah langkah.

Perhatikan bahwa penjaganya memakai lebih kecil atau sama dengan nol, bukan sama dengan nol saja. Satu perbandingan menangani kedua kasus sekaligus, dan itu biasanya tanda bahwa keduanya memang satu persoalan yang sama: langkah yang tidak bergerak ke arah yang benar.

Melihat penjaga menolak

IF step <= 0
  OUTPUT -1
END
SET langkah = 0
WHILE start > 0
  SET start = start - step
  SET langkah = langkah + 1
END
OUTPUT langkah
start10
step-2

Penjaga diperiksa lebih dulu: apakah -2 lebih kecil atau sama dengan nol? Ya.

Langkah 1 dari 2
start 10, step -2. Perhatikan loop tidak pernah dibuka, dan bayangkan apa yang terjadi tanpa penjaganya.

Nilai yang sudah habis sejak awal

Satu kasus lagi, dan ini yang benar benar menghasilkan nol. Nilai awal nol sudah memenuhi kondisi berhenti sebelum satu putaran pun berjalan, jadi jawabannya nol langkah. Bedakan dengan hati hati dari negatif satu: nol berarti tidak perlu melangkah, negatif satu berarti tidak mungkin melangkah. Keduanya angka kecil yang mudah tertukar, dan artinya berlawanan.

Periksa pemahaman

start bernilai 0 dan step bernilai 0. Apa keluarannya?

Ringkasan

  • Loop berhenti hanya bila nilai yang diperiksa kondisinya bergerak menuju berhentinya.
  • Langkah nol dan langkah berarah berlawanan sama sama tidak menggerakkannya.
  • Batas jumlah putaran menyembunyikan pertanyaan yang salah, dan angkanya terbaca seperti hasil perhitungan.
  • Ketidakmungkinan lebih baik dinyatakan sebagai nilai yang tidak dapat disalahartikan.
  • Nol langkah dan tidak mungkin melangkah adalah dua jawaban berbeda. Jangan sampai keduanya tertukar.
  • Letak penjaga menentukan jawaban ketika dua kasus tepi bertemu, jadi letaknya keputusan yang sadar.