Salah satu kemampuan komputer yang dapat dimanfaatkan adalah mengulang suatu
instruksi, bahkan aksi, secara berulang-ulang dengan peformansi yang sama. Berbeda
dengan manusia yang cenderung melakukan kesalahan jika melakukan hal yang sama
(karena lelah atau bosan), komputer akan melakukan pengulangan dengan setia sesuai
dengan perintah yang diberikan.
Pengulangan terdiri dari dua bagian:
- kondisi yang mengakibatkan pengulangan suatu saat berhenti, yang dinyatakan
oleh sebuah ekspresi logik baik secara eksplisit maupun implisit,
- badan pengulangan, yaitu aksi yang harus diulang selama kondisi yang ditentukan
untuk pengulangan masih dipenuhi.
Pengulangan harus berhenti, ini yang harus dijamin oleh pemrogram. Pada bab
tentang "mengupas kentang" telah diberikan suatu contoh di mana pengulangan
mungkin dilakukan terus menerus dan salah satu karena sifat algoritma yang harus
dipenuhi adalah terjadi dalam selang waktu terbatas maka pengulangan yang terus
menerus (looping) adalah algoritma yang salah.
Pengulangan yang terus-menerus harus dapat dideteksi pemrogram bahkan sebelum
program dieksekusi oleh mesin, berdasarkan invariansi dari badan pengulangan
tersebut.
Notasi pengulangan adalah salah satu notasi dasar dalam penulisan algoritma selain
analisis kasus. Namun notasi tersebut hanya akan ada artinya jika dikenakan terhadap
skema tertentu. Notasi pengulangan yang berdiri sendiri tidak ada artinya, bahkan
menyesatkan karena pada hakekatnya notasi pengulangan hanyalah merupakan
sebagian dari skema pengulangan yang akan dibahas pada bab-bab berikutnya.
Ada lima macam notasi pengulangan:
Pengulangan Berdasarkan Banyaknya Pengulangan
Aksi akan diulang sebanyak n kali, dan bukan urusan pemrogram untuk mengelola
pengulangan tersebut. Dengan hanya menyebutkan pengulangan tersebut,
pengulangan pasti akan berhenti suatu saat.
Pengulangan Berdasarkan Kondisi Berhenti
Aksi akan dihentikan jika kondisi-berhenti dipenuhi (bernilai true), akan diulang jika
kondisi-berhenti belum tercapai. Badan pengulangan pada notasi ini (Aksi) minimal
akan dilakukan satu kali karena pada waktu eksekusi pengulangan yang pertama tidak
ada dilakukan test terhadap kondisi-berhenti. Tes terhadap kondisi berhenti dilakukan
setelah Aksi dilaksanakan. Pengulangan ini berpotensi untuk menimbulkan
"kebocoran" (ada Aksi yang dileksekusi tanpa pernah diperiksa kondisi
pelaksanaannya), jika ada kemungkinan bahwa seharusnya Aksi tidak pernah boleh
dilakukan untuk kasus yang tertentu.
Aksi sekuensial yang dilakukan adalah : Aksi, tes kondisi-berhenti, [Aksi, tes kondisi-
berhenti, ..., dan seterusnya] diakhiri tes kondisi-berhenti yang bernilai true, yang
menyebabkan pengulangan berhenti.
Pengulangan Berdasarkan Kondisi Ulang
Aksi akan dilakukan selama kondisi-pengulangan masih dipenuhi (bernilai true).
Badan pengulangan (Aksi) pada notasi ini mungkin tidak akan pernah dilakukan,
karena sebelum aksi yang pertama dieksekusi dilakukan tes terhadap kondisi berhenti.
Tes terhadap kondisi-pengulangan dilakukan setiap kali sebelum Aksi dilaksanakan.
Pengulangan ini berpotensi untuk menimbulkan aksi "kosong" (tidak pernah
melakukan apa-apa karena pada tes yang pertama, kondisi-pengulangan tidak
dipenuhi atau bernilai false).
Aksi sekuensial yang dilakukan adalah: tes kondisi-pengulangan, [Aksi, tes kondisi-
pengulangan, ..., dan seterusnya] diakhiri tes kondisi-pengulangan yang bernilai false,
yang menyebabkan pengulangan berhenti.
Pengulangan Berdasarkan Dua Aksi
Pengulangan ini seolah-olah adalah "gabungan" antara bentuk pengulangan kedua dan
ketiga. Mekanisme yang dilakukan oleh pengulangan ini adalah dengan melakukan
secara otomatis Aksi-1 pada eksekusi yang pertama kemudian dilakukan tes terhadap
kondisi berhenti. Tergantung kepada kondisi berhenti yang dites:
- Aksi-2 akan diaktifkan dan kemudian Aksi-1 yang berikutnya diulang, atau
- pengulangan dihentikan karena efek neto dari Aksi-1 menghasilkan kondisi
berhenti.
Pengulangan ini berguna untuk kasus-kasus di mana Aksi-2 merupakan hal yang harus
dilakukan tergantung dari hasil Aksi-1.
Aksi sekuensial yang dilakukan adalah: Aksi-1, tes kondisi-berhenti, [Aksi-2, tes
kondisi-berhenti, ..., dan seterusnya] diakhiri tes kondisi-berhenti yang bernilai true,
yang menyebabkan pengulangan berhenti.
Pengulangan Berdasarkan Pencacah
nama--pencacah harus suatu type yang terdefinisi suksesor dan predesesornya,
setelah pelaksanaan pengulangan selesai, harga yang tersimpan pada nama-pencacah
tidak terdefinisi: jika hendak dipakai, harus didefinisikan kembali.
Aksi akan dilakukan dengan memperhitungkan harga-harga dari nama-pencacah yang
di"jelajahi", dipakai satu per satu secara berturutan. Dengan memakai pengulangan
ini, pemrogram tidak perlu melakukan operasi terhadap suksesor/predesesor karena
setiap kali selesai melakukan Aksi, otomatis mesin akan melakukan operasi untuk
mendapatkan suksesor dari harga yang sedang berlaku saat itu untuk nama.
Pengulangan otomatis berhenti setelah penjelajahan terhadap nama-pencacah sudah
mencakup semua harga yang terdefinisi dalam range harga. Harga yang tersimpan
pada nama-pencacah setelah pengulangan selesai dilaksanakan tidak terdefinisi, jika
ingin dipakai harus didefinisikan kembali. Pengulangan ini biasanya dipakai jika
harga yang tersimpan dalam nama-pencacah ingin dimanfaatkan dalam Aksi, namum
tidak boleh diubah karena akan mengacaukan urutan eksekusi yang dilakukan.
Pada bahasa pemrograman yang dapat dieksekusi mesin, nilai dan perubahan nama-
pencacah dikontrol oleh pemroses bahasa. Harga yang tersimpan pada nama-
pencacah setelah pengulangan selesai dilaksanakan tidak terdefinisi, jika ingin
dipakai harus didefinisikan kembali.
Contoh
Berikut ini akan diberikan suatu contoh program kecil yang hasilnya sama, namun
diimplementasi dengan ke bentuk pengulangan yang berbeda-beda.
Deskripsi persoalan:
Tuliskanlah sebuah program yang membaca sebuah nilai N (integer positif lebih besar
daripada nol), dan menuliskan output nilai 1, 2, 3, 4, ..., s.d. N berderet ke bawah
sebagai berikut:
1
2
3
....
...
N
Contoh:
Jika N = 3 maka outputnya adalah
1
2
3
Jika N = 1 maka outputnya adalah
1
.jpeg)
Catatan:
Sebenarnya untuk persoalan ini, bentuk pengulangan repeat N times kurang sesuai.
Pemakaian yang sesuai misalnya jika harus menggambar segi empat, maka kita harus
menggambarkan 4 sisi. Penggambaran setiap sisi inilah yang diulang 4 kali.
Penjelasan:
1. Dengan bentuk ini, harus dijamin bahwa nilai N yang dibaca sesuai dengan
spesifikasi, yaitu N > 0. Jika nilai yang diberikan tidak sesuai dengan spesifikasi,
maka akan tertulis angka 1. Untuk mengatasi hal ini dapat dilakukan misalnya
bahwa nilai N yang dibaca “diulang” sehingga memenuhi persyaratan N > 0.
2. Nama yang didefinisikan sebagai i akan bernilai 1..N+1.
3. Anda dapat mendefinisikan i sebagai bilangan yang sudah ditulis dan memulai i
dengan 0. Dalam hal ini nilai i adalah 0..N.
Penjelasan:
1. Dengan bentuk ini, nilai 1 belum tentu ditulis. Jika ternyata pengguna
memberikan nilai N yang negatif atau 0, program tidak menuliskan apa-apa
karena kondisi yang diperiksa pertama kali (i ≤ N) menghasilkan false.
2. Nama yang didefinisikan sebagai i akan bernilai 1..N+1.
3. Anda dapat mendefinisikan i sebagai bilangan yang sudah ditulis dan memulai i
dengan 0. Dalam hal ini domain nilai i adalah 0..N.
Penjelasan:
1. Dengan bentuk ini, nilai 1 pasti ditulis. Jika ternyata pengguna memberikan nilai
N yang negatif atau 0, program akan menuliskan 1 kemudian berhenti.
2. Nama yang didefinisikan sebagai i akan bernilai 1..N, jika N positif.
3. Anda dapat mendefinisikan i sebagai bilangan yang sudah ditulis dan memulai i
dengan 0. Dalam hal ini aksi di antara iterate ... stop adalah penambahan nilai i,
sedangkan aksi sesudah kata stop adalah aksi penulisan
Penjelasan:
1. Bentuk ini ekivalen dengan bentuk iterate, untuk i [1..N], namun pertambahan
nilai i ditangani secara implisit oleh pemroses bahasa.
2. Jika N yang diberikan oleh pengguna bernilai negatif, maka tidak terjadi aksi
penulisan karena nilai i di luar domain [1..N].
Ada bermacam-macam pengulangan, sebenarnya satu bentuk pengulangan dapat
"diterjemahkan" menjadi bentuk yang lain dengan notasi algoritmik yang tersedia.
Contohnya untuk persoalan menuliskan nilai 1...N di atas.
Instruksi pengulangan tidak dapat berdiri sendiri, melainkan harus disertai dengan
instruksi-instruksi lain sebelum dan sesudah pengulangan.
Persoalannya adalah memilih bentuk pengulangan yang benar dan tepat untuk
kelas persoalan tertentu. Pada kuliah algoritma dan pemrograman ini, pemilihan bentuk pengulangan yang tepat merupakan salah satu objektif dari pelajaran dan
merupakan inti dari "desain" algoritmik.
Tidak semua bahasa pemrograman yang ada menyediakan semua bentuk pengulangan
di atas. Hal ini dapat dianalogikan dengan satu set pisau dapur yang terdiri dari
puluhan macam pisau misalnya untuk memotong daging, sayur, buah. bahkan ada
yang dirancang dengan sangat khusus untuk buah tertentu (grape fruit) karena
mempermudah operasi pemotongan atau pengupasan yang dilakukan. Namun dalam
keadaan darurat, ketika tidak semua pisau tersedia kita dapat memakai misalnya pisau
sayur untuk memotong daging walaupun tidak semudah menggunakan pisau daging.
Hal yang sama terjadi dengan pemilihan bentuk pengulangan jika bahasa
pemrograman yang dipakai tidak menyediakan. Sebaiknya dalam hal ini yang
dilakukan adalah memilih bentuk pengulangan yang tepat dan menterjemahkannya
dalam instruksi yang tersedia pada bahasa eksekusi. Ini merupakan terjemahan desain
algoritmik menjadi kode program.
Komentar
Posting Komentar