Satranc oynamak gibi biraz. Ilk basta tamamen icgudusel olarak, mantikli olan hamleyi yaparsin.
Bir suru amator hata yaparsin, usta oyuncularin hamlelerini anlamlandiramazsin.
Sonra biraz ogrenince, formal olarak egitirsin kendini. Acilis teorileri vs gibi daha genis perspektiften olaya bakarsin ve bir seyler anlamlanmaya baslar.
Elindeki problemi incelerken kagit kalem alip, problemi nasil cozecegini kagitta kendine gostermen gerekir.
Ornek vereyim, 100 sayisini bolen kac tane sayi var, bunu bulan algoritmayi yazacaksin.
Dusunelim, bu problemi bilgisayar kullanmadan cozmeye calissan; ilk aklina gelen sey nedir? 1 den baslar, 100 e kadar tek tek her sayiyi denersin. 1 ile bolunuyor mu, 2 ile bolunuyor mu vs gibi. Her bolunebilen sayi kesfettiginde, bir yerlere bir "isaret" koyarsin; sonra o isaretleri toplar sonuca ulasirsin.
O halde burada bir sekilde loop kullanman gerektigi sonucuna varirsin.
Sonra farkedersin ki, 2 ile bolunebiliyorsa 100, 50 ile de bolunebiliyordur. 4 ile bolunuyorsa 25 ile de bolunebiliyordur. 100 e kadar denemeye gerek yok. Hatta 25 e kadar gitmeye gerek yok. Peki kaca kadar denemek gerekecek? Bir sayiyi bolebilen 2 sayi, birbirine en yakin hangi noktada durabilir?
Biraz dusununce bu sayinin, 10 oldugunu, yani cozmeye calistigin sayinin karesi oldugunu kesfedersin. O halde, 1 den 100 e kadar bolmeye calisirken, aslinda 1 den 10 a kadar test etsen ve her kesfettigin bolebilen sayi icin 2 tane cizgi ceksen sonucu ayni bulacaksin.
Bu basit analiz ile, 10 kat hizlandi algoritma.
Peki simdi algoritma olusturmadan once en kritik noktalardan birine geldik, o da
genel formul e ulasma asamasi. Herhangi bir X pozitif tamsayisi icin, nasil bir cozum uygulanmali?
- Once karekokunu alip, hangi sayiya kadar loop yapacagini bulmak. Y olsun.
- 1 den Y ye kadar her sayi icin test edip, eger tam boluyorsa bir yerlerdeki "bolunebilen sayilar" degerini 2 arttiracaksin. Bu asamada bolunebilen sayilari icin de bir degisken tutman gerektigi sonucuna ulastin. ( Eger sayinin kare koku tamsayi ise, o sayiyi 2 defa saymamaya dikkat etmen gerektigini bu asamada farkedersin. )
- Tum bunlari pseudocode ile yazmak. Bu kisim yeni baslayanlar icin cok onemli.
Hepsini tamamlayinca bilgisayarin basina gecip kodu yazmak. Ustteki basit yaklasim ile, herhangi sayinin bolenlerinin toplamini bulan en efektif algoritmalardan birini yazmis olursun. Sonuca bakinca "aa evet, ben de bunu dusunebilirdim" dersin belki ama, ilk basta dusunebilmen icin once 1'den 100'e kadar giden naif yontem ile baslaman gerekiyor ki aklina "aslinda o kadar loop yapmaya gerek yok" fikri gelsin.
1 den 100 e kadar sayilari toplamak icin naif yontem nedir? 1+2+3... seklinde yazarsin.
Sonra farkedersin ki, 1+100= 2+99 = 3+98 .... O halde aslinda 100 defa gitmektense, toplami 101 olan sayilari 50 tane cantada dusunup, direkt olarak 50 * 101 yaparak cozebilirsin. Gauss'un kesfettigi de buydu. Cok zarif bir cozum.
O sebeple calisirken direkt sonuca atlayip, "Hmm, boyle sorular soyle yapiliyormus" diye ezberlemek cok yanlis. Isin mutfagina girip kafa yormak, sonucu degil nasil dusunmen gerektigini ogrenmek gerekiyor.
Yeterince zaman gecince en kompleks algoritmalarin arkasindaki zerafeti gormeye baslarsin. Matematik bu yuzden onemli zaten. Pek az insan programlama yaparken limit, turev integral kullaniyor. Ancak aslinda algoritmanin kendisi matematik. Beyninde ayni noktayi calistirman gerekiyor.
Formal egitim olarak da, klasik algoritmalar ve ozellikle nasil calistiklarin ogrenmek, hangi problemlere uygulayabilecegini ogrenmek. Klasik olmayan bir problem icin, hangi varyantlarini kullanabilecegini, elindeki programlama becerisini gercek hayata nasil adapte edebilecegini kavramak gerekiyor.