Berhenti tanpa tahu berapa kali

Kadang yang diketahui hanya kapan harus berhenti, bukan berapa kali harus berputar.

Sebaiknya baca lebih dulu: Menghitung sampai berhenti.

Dua jenis loop

Pelajaran sebelumnya memakai jenis pertama: batasnya diketahui, yaitu n. Di sini jenis kedua. Pertanyaannya berapa kali sebuah nilai harus dibagi dua sampai mencapai satu atau kurang, dan jawabannya tidak dapat dihitung tanpa menjalankannya.

IngatBila yang diketahui hanya kondisi berhentinya, counternya menjadi hasil, bukan pengendali.

Perbedaan itu terlihat pada peran variabel counternya. Pada loop berhitung, counter yang menentukan kapan berhenti. Di sini yang menentukan berhenti adalah nilai yang sedang menyusut, dan counternya hanya mencatat sudah berapa kali. Ia keluaran, bukan kemudi.

SET langkah = 0
WHILE value > 1
  SET value = FLOOR(value / 2)
  SET langkah = langkah + 1
END
OUTPUT langkah
value yang menyusut dan mengendalikan berhentinya. langkah hanya mencatat, dan itulah yang dikeluarkan.

Melihat nilainya menyusut

SET langkah = 0
WHILE value > 1
  SET value = FLOOR(value / 2)
  SET langkah = langkah + 1
END
OUTPUT langkah
value7
langkah0

Pencatat langkah dimulai dari nol.

Langkah 1 dari 9
value bernilai 7. Perhatikan pembagian pertama menghasilkan 3, bukan 3,5, dan langkahnya berakhir pada 2.

Tanpa pembulatan, tidak pernah berhenti

Tanpa pembulatan

WHILE value > 1
  SET value = value / 2
END

Dengan pembulatan ke bawah

WHILE value > 1
  SET value = FLOOR(value / 2)
END

Kolom kiri terus membagi dua tanpa pembulatan: 7 menjadi 3,5 lalu 1,75 lalu 0,875. Angkanya memang akhirnya turun di bawah satu, jadi kasus ini berhenti. Tetapi angkanya menjadi pecahan yang makin kecil, dan pada nilai tertentu jumlah putarannya melonjak jauh dari yang dimaksud. Yang lebih penting: keluarannya sudah bukan jawaban atas pertanyaan yang ditanyakan, sebab pertanyaannya tentang pembagian bilangan bulat.

Loop yang tidak pernah berhenti hampir selalu punya bentuk yang sama: nilai yang dipakai kondisi ternyata tidak benar benar bergerak menuju berhentinya. Kadang karena tidak diubah sama sekali, seperti pada pelajaran sebelumnya. Kadang karena diubah dengan cara yang tidak pernah melewati batasnya.

Dua nilai yang tidak berputar sama sekali

  • value bernilai 1: kondisi 1 > 1 salah pada pemeriksaan pertama, jadi jawabannya nol langkah.
  • value bernilai 0: kondisi 0 > 1 juga salah, jawabannya nol langkah. Bukan galat, dan bukan angka negatif.

Kedua kasus itu bukan pengecualian yang perlu ditulis sebagai cabang tersendiri. Kondisi yang diperiksa sebelum badan dijalankan sudah menanganinya, dan menambahkan penjaga khusus untuk keduanya hanya menambah baris yang tidak pernah mengubah hasil.

Periksa pemahaman

Berapa langkah untuk value bernilai 8?

Ringkasan

  • Kalau jumlah putarannya diketahui di awal, pakai counter sebagai pengendali.
  • Kalau hanya kondisi berhentinya yang diketahui, counternya menjadi hasil.
  • Nilai yang dipakai kondisi wajib benar benar bergerak menuju berhentinya.
  • Pembulatan ke bawah bagian dari kondisi berhenti, bukan detail aritmetika.
  • Nilai yang sudah memenuhi kondisi berhenti sejak awal menghasilkan nol putaran, dan itu jawaban yang benar.
  • Nilai pangkat dua tidak dapat menguji pembulatan, sebab pembagiannya selalu bulat.