Wikipedia:Bak pasir: Perbedaan antara revisi

Konten dihapus Konten ditambahkan
Bona Kartono (bicara | kontrib)
reset
Bona Kartono (bicara | kontrib)
reset
Baris 1:
kuantitas]] yang diberikan padanya sejak awal sebelum algoritma dijalankan"
(Knuth 1973:5).
</ref>
instruksi-instruksi tersebut menjelaskan sebuah [[komputasi]] yang, bila [[Eksekusi (komputasi)|dieksekusi]], diproses lewat sejumlah urutan kondisi terbatas
<ref>
"Sebuah prosedur yang memiliki semua karakteristik dari sebuah algoritma kecuali prosedur yang tidak memiliki keterbatasan bisa disebut sebagai sebuah 'metode komputasi'"
(Knuth 1973:5).
</ref>
yang terdefinisi dengan baik, yang pada akhirnya menghasilkan "keluaran"
<ref>
"Sebuah algoritma memiliki satu atau lebih keluaran, yaitu kuantitas yang memiliki relasi tertentu terhadap masukan"
(Knuth 1973:5).
</ref>
dan berhenti di kondisi akhir.
Transisi dari satu kondisi ke kondisi selanjutnya tidak harus [[deterministik]];
beberapa algoritma, dikenal dengan [[algoritma pengacakan]], menggunakan masukan acak.
<ref>
Apakah sebuah proses dengan proses-proses bagian dalam yang acak (tidak termasuk masukan) adalah sebuah algoritma atau bukan masih diperdebatkan.
Rogers beropini bahwa: "sebuah komputasi dilakukan dengan sebuah gaya diskrit bertahap, tanpa menggunakan metode-metode berkelanjutan atau perangkat analog ... dijalakan terus secara deterministik, tanpa menggunakan metode-metode atau perangkat acak, misalnya, dadu"
Rogers 1987:2
</ref>
 
Walaupun ''agorism''-nya [[al-Khawarizmi]] dirujuk sebagai aturan-aturan melakukan aritmatika menggunakan bilangan Hindu-Arab dan solusi sistematis dan [[persamaan kuadrat]], sebagian formalisasi yang nantinya menjadi ''algoritma'' modern dimulai dengan usaha untuk memecahkan [[permasalahan keputusan]] yang diajukan oleh [[David Hilbert]] di tahun 1928.
Formalisasi selanjutnya dilihat sebagai usaha untuk menentukan "[[penghitungan efektif]]"
<ref>
Kleene 1943 dalam Davis 1965:274
</ref>
atau "metode efektif";
<ref>
Rosser 1939 dalam Davis 1965:225
</ref>
formalisasi tersebut mengikutkan [[Kurt Godel|Godel]]-[[Jacques Herbrand|Herbrand]]-[[Stephen Cole Kleene|Kleene]] [[Rekursi (ilmu komputer)|fungsi rekursif]]-nya [[Kurt Godel]] - [[Jacques Herbrand]] - [[Stephen Cole Kleene]] di tahun 1930, 1934, dan 1935, [[kalkulus lambda]]-nya [[Alonzo Church]] di tahun 1936, "[[Formulasi 1]]"-nya [[Emil Post]] di tahun 1936, dan [[Mesin Turing]]-nya [[Alan Turing]] di tahun 1936-7 dan 1939.
Dari definisi formal dari algoritma di atas, berkaitan dengan konsep intuituf, masih tetap ada masalah yang menantang.
<ref>{{cite book
| last1 = Moschovakis
| first1 = Yiannis N.
| editor1-last = Engquist
| editor1-first = B.
| editor2-last = Schmid
| editor2-first = W.
| title = Mathematics Unlimited — 2001 and beyond
| url = http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.32.8093
| year = 2001
| publisher = Springer
| isbn = 9783540669135
| pages = 919–936 (Part II)
| chapter = What is an algorithm?
}}</ref>
 
== Definisi Informal ==
{{about|
|presentasi rinci dari berbagai sudut pandang mengenai definisi "algoritma"
|Karakterisasi Algoritma
|Contoh dari algoritma penjumlahan sederhana yang dijelaskan dalam karakterisasi Algoritma
|Contoh algoritma
}}
 
Walau tidak ada definisi ''formal'' dari algoritma yang diterima secara umum, definisi informalnya bisa berarti "sekumpulan aturan yang secara tepat menentukan seurutan operasi". <ref>Stone 1973:4</ref>
yang mengikutkan semua program komputer, termasuk program yang tidak melakukan perhitungan numerik.
Bagi beberapa orang, sebuah program hanyalah sebuah algoritma yang bakal berhenti.
<ref> Stone secara sederhana membutuhkan "harus berhenti dalam sejumlah langkah" (Stone 1973:7-8).
</ref>
Bagi yang lainnya, sebuah program hanyalah sebuah algoritma jika dia melakukan sejumlah langkah-langkah perhitungan.
 
Sebuah contoh tipikal algoritma adalah [[algoritma Euclid]] untuk menentukan bilangan pembagi terbesar dari dua integer; sebagai contohnya (masih ada contoh yang lain) dijelaskan dengan [[diagram alur]] di atas dan sebagai contoh di bagian nanti.
 
{{Harvtxt|Boolos|Jeffrey|1974, 1999}} memberikan sebuah makna informal dari kata algoritma dalam persamaan berikut:
 
<blockquote>
Tidak ada manusia yang dapat menulis begitu cepat, atau begitu lama, atau begitu kecil ("kecil, dan lebih kecil tanpa batas ... anda mungkin mencoba menulis di atas molekul, atom, elektron") untuk mencatat semua anggota dari kumpulan bilangan tak terbatas dengan menuliskan namanya, bergantian, dalam suatu notasi.
Tapi manusia bisa melakukan sesuatu yang sama bergunanya, pada kasus kumpulan bilangan tak terbatas: Mereka dapat memberikan '''instruksi jelas untuk menentukan anggota ke-''n'' dari set''', untuk ''n'' terbatas acak.
Instruksi tersebut diberikan secara eksplisit, dalam bentuk yang mana '''dapat diikuti oleh mesin penghitung''', atau oleh '''manusia yang mampu melakukan hanya operasi-operasi dasar pada simbol-simbol.'''
<ref>
Boolos and Jeffrey 1974, 1999:19
</ref>
</blockquote>
 
Istilah "bilangan tak-terbatas" artinya "bisa dihitung menggunakan integer bisa saja sampai tak terbatas."
Maka, Boolos dan Jeffrey mengatakan bahwa sebuah algoritma berarti instruksi bagi sebuah proses yang "membuat" keluaran integer dari sebuah "masukan" ''acak'' integer yang, secara teori, bisa dipiliah dari 0 sampai tak-terbatas.
Maka sebuah algoritma dapat berupa persamaan aljabar seperti '''y = m + n''' -- dua variabel masukan '''m''' dan '''n''' yang menghasikan keluaran '''y'''.
Tapi berbagai penulis yang mencoba mendefinisikan persamaan tersebut mengatakan bahwa kata tersebut mengandung lebih dari itu, sesuatu yang berada pada (sebagai contoh penjumlahan):
:Instruksi rinci dan tepat (dalam bahasa yang dipahami oleh "komputer")
<ref>cf Stone 1972:5</ref>
untuk proses yang cepat, efisien, "baik"
<ref>
Knuth 1973:7 menyatakan: "Pada praktiknya kita tidak hanya menginginkan algoritma, kita menginginkan algoritam yang ''baik'' ... salah satu kriteria dari kebaikannya adalah lama waktu yang digunakan untuk menjalankan algoritma ... kriteria lainnya adalah kemampuan adaptasi dari algoritma ke komputer, kesederhanaan dan elegan, dll."
</ref>
yang menentukan "pergerakan" dari "komputer" (mesin atau manusia, dibekali dengan informasi dan kemampuan internal yang dibutuhkan)
<ref>
cf Stone 1973:6
</ref>
untuk menemukan, dekode, dan kemudian mengolah masukan integer/simbol '''m''' dan '''n''', simbol '''+''' dan '''=''' ... dan "secara efektif"
<ref>
Stone 1973:7-8 menyatakan bahwa harus ada, "... sebuah prosedur yang robot [yaitu komputer] bisa ikuti supaya dapat menentukan secara tepat bagaimana mengikuti instruksi tersebut."
Stone menambahkan keterbatasan dari proses, dan kepastian (tidak memiliki kerancuan pada instruksi) pada definisi tersebut.
</ref>
menghasilkan, dalam waktu yang "masuk akal",
<ref> Knuth, loc. cit </ref>
keluaran integer '''y''' pada tempat dan format tertentu.
 
Konsep dari ''algoritma'' juga digunakan untuk mendefinisikan notasi dari [[desidabilitas (logika)|desidabilitas]].
Notasi tersebut adalah pusat untuk menjelaskan bagaimana [[sistem formal]] berasal dari sejumlah kecil [[aksioma]] dan aturan.
Dalam [[logika]], waktu dari sebuah algoritma untuk selesai tidak dapat dihitung, karena tidak berelasi dengan dimensi fisik kita.
Dari ketidakpastian tersebut, yang mengkarakteristikan pekerjaan yang berjalan, timbulah ketak-beradaan dari definisi ''algoritma'' yang sesuai dengan konkrit (pada tingkat tertentu) dan penggunaan secara abstrak dari istilah tersebut.
 
== Formalisasi ==
 
Algoritma sangat penting bagi cara komputer mengolah data.
Banyak [[program komputer]] mengandung algoritma memberikan rincian pada instruksi khusus yang komputer harus lakukan (dengan urutan tertentu) untuk menjalankan pekerjaan tertentu, seperti menghitung gaji karyawan atau mencetak kartu rapor siswa.
Maka, sebuah algoritma bisa dianggap sebagai urutan operasi yang bisa disimulasikan oleh sebuah sistem [[Kelengkapan Turing|Turing-lengkap]].
Penulis yang mendukung tesis ini termasuk Minsky (1967), Savage (1987), dan Gurevich (2000):
<blockquote>
Minsky: "Tapi kita juga menjaga, dengan Turing ... bahwa setiap prosedur yang "secara alami" disebut efektif, bisa dinyatakan oleh mesin (sederhana).
Walaupun tampaknya ekstrim, alasan tersebut ... sukar disanggah".
<ref name="Minsky 1967:105">
'''Minsky''' 1967:105</ref>
</blockquote>
 
<blockquote>
Gurevich: "... argumen informal Turing untuk menyokong tesis ini membenarkan tesis yang lebih kuat: setiap algoritma bisa disimulasikan oleh sebuah mesin Turing ... menurut Savage [1987], sebuah algoritma adalah sebuah proses penghitungan yang ditentutkan oleh sebuah mesin Turing".
<ref>
Gurevich 2000:1, 3
</ref>
</blockquote>
 
Biasanya, bila sebuah algoritma dihubungkan dengan pengolahan informasi, data dibaca dari sumbar masukan, ditulis ke perangkat keluaran, dan/atau disimpan untuk pengolahan selanjutnya.
Data simpanan dianggap sebagai bagian dari keadaan internal dari entitas yang melakukan algoritma.
Pada prakteknya, keadaan tersebut disimpan satu atau lebih [[struktur data]].
 
Untuk beberapa proses komputasi, algoritma harus ditentukan secara teliti: dijabarkan dengan cara ia bakal berlaku untuk semua kemungkinan yang dapat timbul.
Yaitu, setiap langkah tambahan harus secara sistematis dihadapi, kasus-per-kasus;
Kriteria bagi setiap kasus harus jelas (dan bisa dihitung).
 
Karena sebuah algoritma adalah kumpulan dari langkah-langkah yang tepat, urutan dari komputasi selalu penting bagi berfungsinya algoritma.
Instruksi biasanya diasumsikan terdaftar secara eksplisit, dan dijelaskan dimulai "dari atas" dan terus "ke bawah", sebuah ide yang dijelaskan secara formal oleh ''[[alur kontrol]]''
 
Pada saat ini, diskusi tentang formalisasi algoritma mengasumsikan premis dari [[pemrograman imperatif]].
Hal ini merupakan konsepsi umum, yang mencoba menjelaskan sebuah tugas dalam makna diskrit dan "mekanis".
Keunikan dari konsepsi formalisasi algoritma adalah [[operasi penetapan]], mengatur nilai dari sebuah variabel.
Ia diturunkan dari intuisi "[[ingatan]]" sebagai kertas buram.
Contoh operasi penetapan tersebut ada di bawah.
 
Untuk konsepsi yang lain dari apa yang membentuk sebuah algoritma lihat [[pemrograman fungsional]] dan [[pemrograman logika]].
 
=== Menggambarkan algoritma ===
 
Algoritma dapat digambarkan dengan banyak notasi, termasuk [[bahasa alamiah]], [[pseudokode]], [[diagram alur]], [[bahasa pemrograman]] atau [[tabel kontrol]] (diproses oleh [[penerjemah (komputasi)|penerjemah]]).
Ekspresi bahasa alamiah terhadap algoritma condong lebih banyak dan rancu, dan jarang digunakan untuk algoritma yang kompleks dan teknis.
Pseudokode, diagram alur dan tabel kontrol adalah cara yang terstruktur untuk menggambarkan algoritma yang mencegah banyaknya kerancuan pada penyataan-penyataan bahasa alamiah.
Bahasa pemrograman ditujukan untuk mengekspresikan algoritma dalam sebuah bentuk yang dapat dieksekusi oleh komputer, tapi sering kali digunakan sebagai suatu cara untuk menentukan atau mendokumentasikan algoritma.
 
Ada banyak macam kemungkinan representasi dan seseorang dapat mengekspresikan sebuah program [[mesin Turing]] sebagai urutan dari tabel-tabel mesin (lihat lebih lanjut di [[mesin kondisi-terbatas]], [[tabel transisi kondisi]] dan [[tabel kontrol]]), sebagai diagram alur (lihat lebih lanjut di [[diagram kondisi]]), atau sebagai bentuk [[kode mesin]] atau [[kode assembly]] dasar yang dikenal "kumpulan lipat empat" (lihat lebih lanjut di [[mesin Turing]]).
 
Representasi dari algoritma dapat dikelompokan ke dalam tiga tingkatan dari deskripsi mesin Turing:
<ref> Sipser 2006:157 </ref>
* '''1 Deskripsi tingkat-tinggi'''
:: "... ditujukan untuk menjelaskan algoritma, menghiraukan rincian implementasi. Pada tingkat ini kita tidak perlu menyebutkan bagaimana mesin mengatur perangkat rekam atau kepalanya."
* '''2 Deskripsi implementasi'''
:: "... digunakan untuk menjealskan cara mesin Turing menggunakan kepalanya dan cara menyimpan data. Pada tingkat ini kita tidak memberikan secara rinci kondisi atau fungsi transisi."
* '''3 Deskripsi formal'''
:: Lebih rinci, "tingkat paling rendah", menjelaskan "tabel kondisi" dari mesin Turing.
 
:''Sebagai contoh dari algoritma sederhana "Jumlah m+n" dijelaskan dalam tiga tingkatan tersebut lihat [[contoh algoritma]].''
 
== Implementasi ==
 
Kebanyakan algoritma ditujukan untuk diimplementasikan sebagai [[program komputer]].
Namun, algoritma juga diimplementasikan dengan tujuan lain, seperti dalam [[jaringan saraf]] biologis (sebagai contohnya, pada [[otak manusia]] implementasi [[aritmatika]] atau sebuah serangga yang melihat makanan), dana [[sirkuit elektris]], atau dalam sebuah perangkat mekanis.
 
== Algoritma komputer ==
 
[[File:Euclid's algorithm structured blocks 1.png |thumb |right |Contoh diagram alur dari [[Teorema program terstruktur|struktur Bohm-Jacopini]]: URUTAN (segi empat), WHILE-DO dan IF-THEN-ELSE. Ketiga struktur dibentuk dari kondisi primitif GOTO (IF ''test''=true THEN GOTO step xxx) (wajik), GOTO (segi empat), berbagai operator penetapan (segi empat), dan HALT (bujursangkar). Memasukan struktur tersebut ke dalam blok-penetapan menghasilkan diagram kompleks (cf Tausworthe 1977:100,114).]]
 
Dalam [[sistem komputer]], sebuah algoritma pada dasarnya adalah instansi dari [[logika]] ditulis dana [[perangkat lunak]] oleh pengembang perangkat lunak supaya efektif bagi komputer yang "ditargetkan" untuk mesin tertentu untuk menghasilkan ''keluaran'' dari ''masukan'' yang diberikan (kemungkinan nul).
 
'''Program "Elegan" (padat), "baik" (cepat)''': Pernyataan dari "sederhana dan elegan" muncul secara informal dalam buku Knuth dan dalam Chaitin:
:Knuth: "... kita menginginkan algoritma yang ''baik'' dalam definisi estetika sederhana. Salah satu kriteria ... adalah waktu yang dibutuhkan untuk berjalannya algoritma ... Kriteria yang lain adalah adaptasi dari algoritma ke komputer, kesederhaan dan elegan, dll"
<ref> Knuth 1973:7 </ref>
 
:Chaitin: "... sebuah program adalah 'elegan'', maksud saya adalah ia merupakan program terkecil untuk menghasilkan keluaran."
<ref> Chaitin 2005:32 </ref>
 
Chaitin membuka definisinya dengan: "Saya akan perlihatkan bahwa anda tidak dapat membuktikan sebuah program adalah 'elegan'" -- bukti tersebut akan menyelesaikan [[permasalahan perhentian]] (ibid).
 
'''Algoritma melawan fungsi yang dapat dihitung oleh algoritma''': Untuk sebuah fungsi bisa ada beberapa algoritma.
Hal ini benar, bahkan tanpa mengembangkan kumpulan instruksi yang ada bagi programmer.
Rogers mengamati bahwa "Sangat ... penting untuk membedakan antara pernyataan ''algoritma'', misalnya prosedur dan pernyataan ''fungsi yang dihitung oleh algoritma'', misalnya pemetaan hasil dari prosedur.
Fungsi yang sama bisa memiliki beberapa algoritma berbeda".
<ref>
Rogers 1987:1-2
</ref>
 
Sayangnya ada kekurangan antara kebaikan (kecepatan) dan elegan (kepadatan) -- sebuah program yang elegan bisa melakukan lebih banyak langkah untuk menyelesaikan sebuah komputasi daripada yang kurang elegan.
Sebuah contoh yang menggunakan algoritma Euclid bisa dilihat di bawah.
 
'''Komputer (dan komputor), model dari komputasi''': Sebuah komputer (atau manusia "komputor"
<ref>
Dalam esainya "Calculations by Man and Machine: Conceptual Analysis" Seig 2002:390 memuji perbedaan ini oleh Robin Gandy, cf Wilfred Seig, dll., 2002 ''Reflections on the foundations of mathematics: Essays in honor of Solomon Feferman'', Association for Symbolic Logic, A. K Peters Ltd, Natick, MA.
</ref>
)
adalah tipe mesin yang terbatas, sebuah "perangkat mekanis deterministik diskrit"
<ref>
cf gandy 1980:126, robin gandy ''church's thesis and principles for mechanisms'' appearing on pp. 123–148 in j. barwise et al. 1980 ''the kleene symposium'', north-holland publishing company.
</ref>
yang secara buta mengikuti instruksinya
<ref>
Sebuah "robot": "Sebuah komputer adalah sebuah robot yang melakukan setiap tugas yang dapat dijelaskan sebagai urutan dari instruksi." cf Stone 1972:3
</ref>
model primitif dari Melzak dan Lambek
<ref>
"abacus"-nya Lambek adalah "sejumlah lokasi tak terbatas yang bisa dihitung (lubang, kabel, dll.) berikut dengan persediaan penghitung yang tak terbatas (kerikil, remah roti, dll).
Lokasinya bisa dibedakan, penghitungnya tidak".
Lubangnya memiliki kapasitas tak terbatas, dan digerakan oleh agen yang memahami dan mampu menjalankan sejumlah instruksi" (Lambek 1961:295).
Lambek mengacu Melzak yang mendefinisikan mesin-Q nya sebagau "sejumlah lokasi yang besar tanpa batas ... persediaan penghitung yang tanpa batas yang terdistribusi diantara lokasi-lokasi tersebut, sebuah program, dan sebuah operator yang tujuan satu-satunya yaitu menjalankan program." (Melzak 1961:283).
B-B-J (loc. cit.) menambahkan syarat bahwa lubang tersebut "mampu menyimpan sejumlah batu" (p. 46).
Melzak dan Lambek muncul di ''The Canadian Mathematical Bulletin'', vol. 4, no. 3, September 1961.
</ref>
mengurangi gagasan menjadi empat elemen: (i) diskrit, ''lokasi'' yang bisa dibedakan,
(ii) diskrit, ''penghitung'' yang tak bisa dibedakan
<ref>
Jika tidak ada kebingungan yang dihasilkan, kata "penghitung" bisa dihiraukan, dan sebuah lokasi bisa dikatakan mengandung sebuah "angka".
</ref>
(iii) sebuah agen, dan
(iv) sebuah daftar instruksi yang ''efektif'' relatif terhadap kemampuan dari agen.
<ref>
"Kita mengatakan bahwa instruksi adalah ''efektif'' bila ada sebuah prosedur yang robot dapat ikuti supaya dapat menentukan secara tepat bagaimana mematuhi instruksi." (Stone 1972:6)
</ref>
 
'''Simulasi dari sebuah algoritma: bahasa komputer (komputor)''': Knuth menganjurkan pembaca bahwa "cara terbaik untuk belajar algoritma dalah mencobanya ... langsung ambil pulpen dan kerta dan kerjakan contoh".
<ref> Knuth 1973:4 </ref>
Lalu bagaimana dengan simulasi atau eksekusi yang sebenarnya?
Programmer harus menerjemahkan algoritma ke dalam bahasa yang mana simulator/komputer/komputor dapat mengeksekusi ''secara efektif''.
Stone memberikan contoh dari hal ini: saat menghitung akar dari persamaan kuadrat si komputor harus tahu bagaimana mendapatkan akar kuadrat.
Jika tidak maka supaya algoritma dapat efektif ia harus menyediakan sejumlah aturan untuk menekstrak akar kuadrat.
<ref>
Strone 1972:5. Metode untuk mendapatkan akar tidaklah biasa: lihat [[Metoda untuk menghitung akar kuadrat]].
</ref>
 
Hal ini berarti programer haru tahu sebuah "bahasa" yang efektif relatif terhadap target pada agen komputasi (komputer/komputor).
 
Lalu model apa yang seharusnya digunakan untuk simulasi?
Van Emde Boas mengamati "bahkan bila kita mendasari [[[Teori kompleksitas komputasi|teori kompleksitas]] dengan abstrak bukannya mesin kongkrit, kesembarangan dari pemilihan model masih tetap ada.
Pada titik itulah mulainya pemikiran ''simulasi''".
<ref>
{{cite book
| last = Leeuwen
| first = Jan
| title = Handbook of Theoretical Computer Science: Algorithms and complexity. Volume A
| url = http://books.google.com/?id=-X39_rA3VSQC
| year = 1990
| publisher = Elsevier
| isbn = 978-0-444-88071-0
| page = 85}}
</ref>
Bila kecepatan sedang dihitung, jumlah instruksi berpengaruh.
Sebagai contohnya, subprogram dalam algoritma Euclid untuk menghitung sisa akan berjalan lebih cepat jika programmer memiliki instruksi "modulus" (pembagian) bukannya dengan pengurangan (atau lebih parah: hanya "penurunan").
 
'''Pemrograman terstuktur, struktur kanonikal''': Menurut [[Tesis Church-Turing]] setiap algoritma bisa dihitung dengan sebuah model yang dikenal [[Turing lengkap]], dan menurut demonstrasi Minsky kelengkapan Turing membutuhkan hanya empat tipe instruksi -- GOTO bersyarat, GOTO tak bersyarat, penetapan, HALT.
Kemeny dan Kurtz mengamit bahwa saat penggunaan GOTO tak bersyarat yang "tak disiplin" dan IF-THEN GOTO bersyarat bisa menghasilkan "[[kode spageti]]" seorang programer bisa menulis program tersturktur menggunakan instruksi tersebut;
di lain sisi "juga memungkinkan, dan tidak begitu sulit, untuk menulis sebuah program terstruktur yang buruk dalam sebuah bahasa terstruktur".
<ref>
[[John G. Kemeny]] and [[Thomas E. Kurtz]] 1985 ''Back to Basic: The History, Corruption, and Future of the Language'', Addison-Wesley Publishing Company, Inc. Reading, MA, ISBN 0-201-13433-0.
</ref>
Tausworthe menambahkan tiga [[Teorema program terstruktur|struktur kanon Bohm-Jacopini]]:
<ref> Tausworthe 1977:101 </ref>
SEQUENCE, IF-THEN-ELSE, dan WHILE-DO, dengan dua lagi: DO-WHILE dan CASE.
<ref> Tausworthe 1977:142 </ref>
Keuntungan dari program terstruktur adalah ia cocok dengan [[bukti kebenaran]] menggunakan [[induksi matematika]].
<ref>
Knuth 1973 bagian 1.2.1, dikembangkan oleh Tausworthe 1977 di halaman 100ff dan Bab 9.1
</ref>
 
'''Simbol diagram alur <ref> cf Tausworthe 1977</ref>''': Pembantu grafik yang disebug [[diagram alur]] memberikan suat cara untuk menjelaskan dan mendokumentasikan sebuah algoritma (dan program komputer).
Seperti alur program dari mesin Minsky, sebuah diagram alur selalu mulat dari atas halaman dan terus ke bawah.
Simbol utamanya hanya 4: arah panah memperlihatkan alur program, segi empat (SEQUENCE, GOTO), wajik (IF-THEN-ELSE), dan titik (OR).
Struktur kanonikal Bohm-Jacopini dibuat dari bentuk-bentuk primitif tersebut.
Sub-struktur bisa "bersarang" dalam segi empat hanya jika jalan keluar tunggal terjadi dari super-struktur.
Simbol dan penggunaannya untuk membangun struktur kanonikal diperlihatkan dalam diagram.
 
== Contoh ==
{{Further2|[[Contoh algoritma]]}}
 
=== Contoh Algoritma ===
[[File:Sorting quicksort anim.gif | thumb | Animasi dari [[algoritma quicksort]] mengurutkan larik dari nilai acak. Batang merah menandakan elemen pivot; pada awal animasi, elemen paling kanan dipilih sebagai pivot.]]
 
Salah satu dari algoritma sederhana adalah menemukan bilangan terbesar dalam sebuah daftar angka (tak berurut).
Solusinya biasanya membutuhkan memeriksa setiap angka dalam daftar, tapi hanya sekali.
Dari hal ini munculah algoritma sederhana, yang bisa dinyatakan dalam kalimat bahasa Indonesia deskripsi tingkat-tinggi, sebagai:
 
'''Deskripsi tingkat-tinggi:'''
# Asumsikan item pertama yang terbesar
# Periksa setiap item yang tersisa pada daftar dan jika lebih besar dari item yang ada sekarang, catat angka tersebut
# Item yang paling terakhir dicata adalah yang terbesar di daftar saat proses selesai.
 
'''Deskripsi (Quasi-)formal:'''
Ditulis dalam kalmiat yang lebih dekat dengan bahasa tingkat-tinggi dari program komputer, berikut ini adalah kode formal dari algoritma dalam [[pseudokode]] atau [[kode pijin]]:
 
{{algorithm-begin|name=LargestNumber}}
Input: Daftar angka tidak kosong ''L''.
Output: Angka ''terbesar'' dalam daftar ''L''.
 
''largest'' ← ''L''<sub>0</sub>
'''for each''' ''item'' '''in''' the list ''(Length(L)≥1)'', '''do'''
'''if''' the ''item'' > ''largest'', '''then'''
''largest'' ← the ''item''
'''return''' ''largest''
{{algorithm-end}}
 
=== Algoritma Euclid ===
 
[[File:Euclid's algorithm Book VII Proposition 2 2.png | 250px | thumb | right | Diagram-contoh dari algoritma Euclid dari T.L. Health 1908 dengan rincian tambahan. Euclid tidak sampai pada penghitungan ketiga dan tidak memberikan contoh numeris. Nocomachus memberikan contoh dari 49 dan 21: "Saya mengurangi yang kecil dari yang besar; 28 adalah yang kiri; kemudian saya kurangi lagi 21 (hal ini memungkinkan); tersisa 7, tapi 7 tidak bisa dikurangi dari 7." Heath berkomentar bahwa, "Kalimat terakhir terdengar aneh, tapi maknanya sangat jelas, begitu juga makna dari kalimat tentang mengakhiri 'dengan satu dan angka yang sama'."(Heath 1908:300).]]
 
Algoritma [[Euclid]] muncul sebagai Proposisi II dalam Book VII ("Elementary Number Theory") dari ''[[Euclid's Elements|Elements]]''-nya.
<ref> Heath 1908:300; Hawking's Dover 2005 edisi diambil dari Heath.
</ref>
Euclid mengajukan permasalahan: "Ambil dua angka bukan prima, untuk mencari bilangan pembagi terbesar".
Dia menentukan "Sebuah angka [merupakan] besaran yang terdiri dari unit-unit": angka penghitung, integer positif kecuali 0.
Dan "mengukur" adalah menempatkan ukuran panjang terkecil ''s'' dengan tepat (''q'' kali) diantara ukuran terpanjang ''l'' sampai sisa ''r'' lebih kecil dari panjang terkecil ''s''.
<ref>
"'Biarkan CD, mengukur BF, meninggalkan FA kurang darinya.'
Hal ini merupakan singkatan cerdik untuk mengatakan, ukur pada BA panjang yang sama dengan CD sampai titik F sehingga sisa panjang FA kurang dari CD;
dengan kata lain, misalkan BF adalah yang kelipatan terbesar dari CD yang terdapat dalam BA"
(Heath 1908:297)
</ref>
Dalam dunia modern, sisa ''r = l - q*s'', ''q'' sebagai hasil bagi, atau sisa ''r'' adalah "modulus", bagian sisa-integer yang tersisa setelah pembagian.
<ref>
Untuk percobaan moden menggunakan pembagian dalam algoritma lihat Hardy dan Wright 1979:180, Knuth 1973:2 (Volume 1), ditambah diskusi tentang algoritma Euclid dalam Knuth 1969:293-297 (Volume 2).
</ref>
 
Supaya metode Euclid berhasil, panjang awalnya harus memenuhi dua kebutuhan:
(i) panjangnya tidak 0, DAN
(ii) hasil pengurangan hasil "lebih", sebuah tes harus menjamin bahwa bilangan terkecil dari dua angka adalah hasil pengurangan dari yang terbesar (cara lain, keduanya bisa sama sehingga pengurangan menghasilkan 0).
 
Pembuktian asli Euclid mengikutkan kebutuhan yang ketiga: kedua panjang bukanlah bilangan prima.
Euclid menentukan hal ini supaya dia bisa membentuk sebuah bukti [[reductio ad absurdum]] bahwa dua pembagi dua angka adalah yang ''terbesar''.
<ref>
Euclid mengungkapkan pertanyaan ini dalam Proposisi 1 nya.
</ref>
Walau algoritma Nicomachus sama dengan Euclid, bila kedua bilangan prima maka menghasilkan angka "1" untuk bilangan pembagi terbesar.
Jadi untuk lebih jelasnya algoritma berikut adalah algoritma Nicomachus.
 
==== Contoh ====
 
[[File:Euclids-algorithm-example-1599-650.gif | 350px | thumb | right | Ekspresi grafik dari algoritma Euclid menggunakan contoh dengan 1599 dan 650.]]
 
Contoh dari 1599 dan 650:
 
{| class="wikitable"
|-
| Step 1 || 1599 = 650*2 + 299
|-
| Step 2 || 650 = 299*2 + 52
|-
| Step 3 || 299 = 52*5 + 39
|-
| Step 4 || 52 = 39*1 + 13
|-
| Step 5 || 39 = 13*3 + 0
|}
 
==== Bahasa komputer untuk algoritma Euclid ====
 
Hanya beberapa ''tipe'' instruksi yang dibutuhkan untuk mengeksekusi algoritma -- beberapa tes logika (GOTO bersyarat), GOTO tak bersyarat, penetapan (penggantian), dan pengurangan.
* Sebuah ''lokasi'' disimbolkan dengan huruf besar, misalnya, S, A, dll.
* Kuantitas beragam (angka) dalam sebuah lokasi ditulis dengan huruf kecil dan (biasanya) dihubungkan dengan nama lokasi. Sebagai contohnya, lokasi L pada awal bisa mengandung angka ''l'' = 3009.
 
==== Program yang kurang elegan (inelegan) untuk algoritma Euclid ====
 
[[File:Euclid's algorithm Inelegant program 1.png|thumb|right|"Inelegan" adalah terjemahan dari versi Knuth terhadap algoritma berdasarkan pengulangan-sisa mengganti pembagian (atau instruksi "modulus").