Yazılımda Algoritma Nasıl Geliştirilir?

Blackss

Kilopat
Katılım
29 Temmuz 2016
Mesajlar
571
Makaleler
2
Çözümler
2
Merhabalar, ben yeni Python öğrenmeye başladım.

İlk başlarda fena değilken iyi kötü kodlamalar yapabiliyorken dersler ilerleyip işin içine döngüler girince çok kafam karıştı. Hangi problemde while, while True, for, break, continue kullanmam gerektiğini anlayamıyorum.

Soruları bir türlü kurup kodlamalarını yazamıyorum. İşte kullanıcı tarafından girilen sayının mükemmel sayı olup olmadığını kontrol etme, Armstrong sayısı olup olmadığını kontrol etme, 1'den 100'e kadar olan sayılardan 3'e ve 5'e bölünebilen sayıların toplamı, 1'den 100'e kadar olan sayılardan çift olanları ekrana yazdırma gibi kodlama egzersizleri var.

Bir türlü bunları çözemiyorum. En son dayanamayıp cevaplarına baktığım zaman "ahh be kolaymış nasıl düşünemedim." oluyorum.

Daha programın başında böyle tökezlemek çok canımı sıktı. Nasıl geliştireceğim ben kendimi? Sürekli cevaplara bakarak mı?
 
Ben de lisede yazılım üzerine okumuştum ve seninle aynı durumu yaşamıştım. Bir arkadaşım bu durumu şöyle çözmüştü; "Bir soruyu soru olarak değil bir sorun olarak düşünmek ve bu soruna bir çözüm üretmek lazım.". Şu an senin tek yapman gereken "while, for, break, continue" gibi kavramları tam olarak öğrenmek, ve geriye sadece soruyu anlayıp program diline dökmek kalıyor. Mesela "1'den 100'e kadar olan sayılardan 2'ye ve kendisine bölünebilen sayıları bulan programı yazınız" gibi bir soru olduğunda hangi döngüyü ve nasıl bir algoritma yazabileceğini basit bir şekilde düşünmen gerek. Basit şekilde;
if( sayi1/2 && sayi1/sayi1=sayi1 ) {
grub'a ekle(gibi);
}
Benim aklımda anca bu kadar şey kalmış, üstüne pek gitmediğim için en fazla bu kadar bilgi verebiliyorum, umarım yardımı dokunur. :kıkırda:
 
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?
  1. Once karekokunu alip, hangi sayiya kadar loop yapacagini bulmak. Y olsun.
  2. 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. )
  3. 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.
 
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?
  1. Once karekokunu alip, hangi sayiya kadar loop yapacagini bulmak. Y olsun.
  2. 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. )
  3. 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.
Teşekkürler cevabınız için. Mesela Project Eular sayfasına baktım. Bir ton problem var daha ilkini bile çözemedim. Yani matematiğimde de biraz sıkıntı var herhalde, anlayamadım valla :D

Dediğiniz gibi iş fazla tekrardan geçiyor herhalde. Cevaplarına bakarak anladığım soruları tekrar tekrar çözeceğim bu iş böyle gelişecek gibi. Kursa devam etmek istiyorum bir yandan ama burayı şimdi zayıf bırakıpta geçmek istemiyorum. Bu döngülere kadar güzel gelmiştim burada biraz beynim yandı işte dediğim gibi.

Python bide en kolayı diyorlardı. Allahtan diğerleriyle başlamamışım.
 
Teşekkürler cevabınız için. Mesela Project Eular sayfasına baktım. Bir ton problem var daha ilkini bile çözemedim. Yani matematiğimde de biraz sıkıntı var herhalde, anlayamadım valla :D

Dediğiniz gibi iş fazla tekrardan geçiyor herhalde. Cevaplarına bakarak anladığım soruları tekrar tekrar çözeceğim bu iş böyle gelişecek gibi. Kursa devam etmek istiyorum bir yandan ama burayı şimdi zayıf bırakıpta geçmek istemiyorum. Bu döngülere kadar güzel gelmiştim burada biraz beynim yandı işte dediğim gibi.

Python bide en kolayı diyorlardı. Allahtan diğerleriyle başlamamışım.

Mesele hangi dille basladiginda degil aslinda, nasil yapacagini bilirsen algoritma olarak her dille yaparsin. Syntax degisir. Birinde for ( x in Y ) yazacaksin, digerinde for(i=0; i<X; i++) yaziyorsun. Degisen bir sey yok. Python un guzelligi sade olmasi, kagittaki koda cok benzemesi. Aslinda Python da derinine daldikca zorlasan bir dil, goruntusu ve okumasi sade. Bir de scripting dili oldugu icin calistirip geciyorsun. Compile etme derdi yok, baska isletim sisteminde calistirmak icin konfigure etme problemi yok.

Evet pratik yaptikca acilirsin, merak etme.
 
Uyarı! Bu konu 6 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Yeni konular

Geri
Yukarı