BÖLÜM. Özyineleme Özyineleme Nedir? 10.3 Özyineleme Örnek. Bölümün İçindekileri

Ebat: px
Şu sayfadan göstermeyi başlat:

Download "BÖLÜM. Özyineleme Özyineleme Nedir? 10.3 Özyineleme Örnek. Bölümün İçindekileri"

Transkript

1 327 BÖLÜM 10 Özyineleme 10 Bölümün İçindekileri Karışık kombinasyon problemlerini ve konfigürasyonlarını analiz ederken, permütasyon ve türevlerini üretirken ve iç içe geçmiş döngüleri analiz ederken özyineleme ve uygulamalarını kullanacağız. Metot içinden yine metotun kendisi için yapılan çağrı veya çağrıları temsil eden güçlü programlama tekniklerine özyinelemeli denir. Bu bölümde özyinelemenin doğru ve yanlış kullanımları ile ilgili pek çok örnek göstermeye ve nasıl yararlı olabileceği hakkında doğru yolu göstermeye sizi ikna etmeliyiz. Özyineleme tekniğini kullanmak için yola çıkıyoruz Özyineleme Nedir? Özyineleme, belirli bir sorunu çözmek için bir yöntemin kendisini çağırdığı bir programlama tekniğidir. Metotun kendisi için yapılan bir çağrının belirli konudaki bir sorunu çözmesi olarak da tanımlanabilir. Özyineleme nesnenin kendisini içermesi yada kendi kendisi tarafından tanımlanmasıdır. Doğru kullanıldığında belirli problemlere zarif çözümler getiren bir programlama tekniğidir. Kullanımı, programlama kodunu ve okunabilirliğini bazı durumlar için kolay hale getirir. Bu programlama teknikleri genellikle kodun okunulabilirliğini artırır Özyineleme Örnek Aşağıda bir Fibonacci sayı dizisinin bazı elemanlarını görüyorsunuz. 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,

2 328 Verilen bir Fibonacci dizisinin her elemanı iki önceki elemanın toplamından oluşur. Birinci ve ikinci elemanlar tanım gereği 1 değerini alırken, diğer elemanların diziliş kuralı aşağıda verilmiştir: F 1 = F 2 = 1 F i = F i-1 + F i-2 (for i > 2) Tanıma göre n inci elemanın hesaplanması için aşağıdaki özyineleme metodunu kullanırız: int 2 return 1 return 1 2 Bu örnek bir çözümün uygulanması için özyineleme metotunun nasıl kullanılacağını gösteriyor. Öte yandan, özyineleme ile programlama yaparken sezgisel olmalısınız, çünkü programın verimliği ve hızını etkileyen pek çok faktör vardır. Özyinelemenin avantaj ve dezavantajları için bkz. bu bölümün sonraki alt başlıkları Doğrudan ve Dolaylı Özyineleme Bir metot gövdesi içinden aynı metotun kendisine çağrı yapmışsa, bu doğrudan özyineleme veya direkt özyinelemedir. Verilen bir A metotu herhangi bir B metotunu çağırıyor ve bu B metotu da verilen bir C başka metotunu çağırıyor ve bu C metotu da gerisin geriye tekrar A metotunu çağırmışsa, bunun adı literatürde dolaylı özyineleme veya A, B ve C metotları aralarında indirekt özyineleme vardır demeklerdir. Dolaylı özyineleme çağrılarında birden fazla metot zinciri var olabilir, ancak koşullara veya verilere, parametre değerlerine bağlı olarak bir metot bir başka metota özyineleme çağrısı yaparken, yine başka nedenlerle bir başka metota özyineleme çağrısı yapabilir.

3 Özyinelemenin Sonlandırılması Özyinelemeli programlamada dikkat edilmesi gereken en önemli programlama tekniği, özyineleme zincirlerinin son bulması gerektiği, yada somut sayıda tekrar ettikten sonra sonucu döndürmesidir. Bir başka deyişle, sonsuz sayıda özyineleme yoktur, bu durum yanlış programlamaya yol açar. Bu nedenle özyinelemeyi sonlandırmak için bir yada daha fazla programlama yapısının metot içinde kullanılarak sonuç durumlarının programlanması programcının ana görevidir. Yapılması gerekli bu eylem özyinelemenin sonlandırılması olarak da tanınır. Fibonacci sayıları örneğinde, özyinelemenin sonlandırılma şartı n sayısının 2 veya daha az olmasıdır. Sonlandırılma şartının özyinelemeyi sonlandırmasından emin olmalıyız. Sonlandırılmaya gelen bir metot, daha fazla özyinelemeli çağrı yapmadan içinde bulunduğu çağrıyı sona erdirecek sonucu döndürmelidir. Kodda yapılan bir değerlendirme metotun özyinelemeli sonuç döndüren bir program mı, sonsuz döngü mü yapıldığını ortaya çıkaracaktır. Bu nedenle n=1 ve n=2 için sadece 1 döner Özyinelemeli Metot Oluşturulması Özyinelemeli metotun her tekrarında elde edilen sonuç toplanarak gerçek sonuç oluşturulur. Her özyinelemeli çağrı sonunda problem daha küçük alt birimlere bölünür. Bu küçük problemlere ait alt çözümler bilgisayar tarafından saklanır ve dönüş sağlandığında birleştirilir. Birleştirme işlemi için özyinelemenin sonlandırılması gerekir Faktoriyelin Özyinelemeli Hesaplanması Özyineleme kullanımını klasik bir örnek ile göstereceğiz faktoriyelin özyinelemeli hesaplanması. n faktöriyel (n! olarak gösterilir) 1 ve n (dahil) arasındaki her tamsayının çarpımlarından ibaret bir sayı olarak tanımlıdır. 0! = 1 kabul edilir. n! = n

4 Özyinelemeli Tanım Faktoriyel hesaplanması için bir çözüm oluştururken faktoriyelin özyinelemeli tanımına başvurmak yerinde olacaktır: n! = 1, n = 0 için n! = n.(n-1)!, n > 0 için Özyinelemeli Bağlılık Tespiti Özyinelemeli bağlılık tespiti için uzun uğraş gerekebilir. Faktoriyel örneğimizde, problem analizi ve ilk birkaç durum için faktoriyel değerlerinin hesaplanması yeterlidir. Buradan kolayca tekrarlayan bağlılıkları görebilirsiniz: Gerçekleştirilen Algoritma Özyinelemenin sonlandırılma koşulu 1 değerine sahip n=0 şartıdır. Diğer durumlarda n=n-1 için problemi çözmek zorundayız ve bu alt problem için dönen sonucun n ile çarpımını n=n-1 için döndürmeliyiz. Bu algoritma, belirli bir sayıdaki adım sonrasında özyinelemenin sonuna erişir ve 1 n arasındaki somut sayıdaki tamsayıların çarpımını hesaplar. Bu önemli şartlar ile birlikte, faktoriyel hesaplayan metotu yazabiliriz:

5 331 static int // The bottom of the recursion 0 1 // Recursive call: the method calls itself 1 Bu metotu kullanarak konsoldan bir tamsayı okuyan, bu tamsayının faktoriyelini hesaplayan ve elde edilen değeri yazdıran bir uygulama geliştirebiliriz. RecursiveFactorial static Console n = int int Console Console {0}! = {1} static int // The bottom of the recursion 0 return 1 // Recursive call: the method calls itself return 1 n=5 için uygulamanın çalıştırılması sonucu aşağıda verilmiştir:

6 Özyineleme veya Yineleme? Özyineleme kavramı öğretilirken genellikle faktoriyel hesaplama örnek olarak seçilmiştir, ancak diğerleri gibi bu durumda da özyineleme en iyi seçim değildir. Verilen bir problem için yinelenen (ardışık) bir çözüm her zaman açık olmayabilir. Sıklıkla eğer bir problemin özyinelemeli tanımı verilmişse, özyinelemeli çözüm sezgisel ve çok zor olmamalıdır. Faktoriyel örnek için yinelemeli çözümün gerçekleştirilmesi özyineleme kadar kısa, basit ve hatta biraz daha verimli görünmektedir. int for 1 1 return Bu bölümde daha sonra özyineleme ve yineleme kullanmanın avantaj ve dezavantajlarını dikkate alacağız. Şu andan itibaren özyinelemenin gerçekleştirilmesi ile devam etmeden önce şunu da hatırlatmamız gerekir ki, yinelenen bir değişebilir şart üzerinde düşünmeli ve bu şart sonrasında daha iyi bir çözüm bulmalıyız. Özyineleme kullanılarak çözülen bir probleme göz atalım. Bu örnek için yinelemeli bir çözümü de dikkate alacağız İç içe N Döngünün Simülasyonu Sık sık iç içe döngüler yazmak zorundayız. İki, üç adet veya daha önceden belirli bir sayı kadar döngünün kodlanması kolaydır. Ancak sayılar önceden bilinmiyorsa, farklı bir yaklaşım düşünmekte fayda var. N sayısının 1..K defa tekrarlanarak gösterimini gerçekleştiren aşağıdaki örneği göz önüne alınız: N ve K kullanıcı tarafından girilmelidir.

7 333 for 1 for 1 for 1 Console 1 {0} {1} {2} {N} Örneğin N=2 ve K=3 için (1..3 defa tekrarlanarak gösterimi), ve N=3 ve K=2 için (1..2 defa tekrarlanarak gösterimi), çıktılar aşağıdaki gibidir: Bu problemi çözen algoritmayı önceki örnekte olduğu gibi açıkça anlayamayabilirsiniz. Bunun için biri özyinelemeli, diğeri yinelemeli iki çözüm geliştirebiliriz. Sonucun her satırında, N adet sayının bir sıralı dizilimini görüyorsunuz. Birinci değişken birinci döngü sayacının geçerli değerini temsil eder. İkinci değişken ikinci döngü sayacının geçerli değerini temsil eder, vs. Her sayı 1 ve K arasında değer alabilir. N ve K verildiğinde görevimiz, N elemanın sıralı dizilimlerini bulmaktır İç içe Döngüler Özyinelemeli Yaklaşım Eğer problem için özyinelemeli çözüm arıyorsanız, ilk yaklaşımınız özyinelemeli bağlılık bulmaktır. Örnekte tanımlı olan probleme biraz daha dikkatli bakalım. N=2 için cevabı hesaplasaydık, birinci sayı olarak K koyarak (örneğimizde K=3) N=3 için de cevabı elde edecektik, çünkü diğer sayılar N=2 için hali hazırda yazılı olacaktı. Bu sonlanma koşulu N>3 için de geçerlidir.

8 334 Bu şekilde aşağıdaki bağımlılığı yakaladık ilk pozisyondan itibaren geçerli her konuma 1..K arası değerleri sırasıyla yerleştirdikten sonra bir sonraki pozisyon için özyinelemeli olarak kendimizi çağırdık. Özyineleme N defa kendisini çağırdığında sonlanır ve sayılar K değerine kadar sıralı bir şekilde ard arda yazılır. C# metotu aşağıda gösterilmiştir: return for 1 1 Sayı dizisi loops adlı bir dizide saklanırken, PrintLoops() metoduyla özyineleme sonlandığında bu sayılar basılacaktır. NestedLoops( ) metotu sayıların yerleştirileceği pozisyonları belirten bir parametre almaktadır. Bir sonraki pozisyon için NestedLoops( ) metotunu özyinelemeli olarak çağırdıktan sonra döngü içinde adlandırdığımız olası her değer yazdırılır. numberofiterations değişkeni kullanıcı tarafından girilen K değeri için oluşturulmuştur.

9 335 Geçerli konum N olduğunda en son satır yazılmıştır ve özyineleme sonlanır. numberofloops değişkeni kullanıcı tarafından girilen K değeri için oluşturulmuştur. Geçerli konum N olduğunda en son satır yazılmıştır ve özyineleme sonlanır. Bu noktada tüm pozisyonlarda değerlerimiz vardır ve diziyi yazdırırız. Özyinelemeli olarak iç içe döngü ile ilgili bir çözümün tam bir uygulaması aşağıda verilmiştir: RecursiveNestedLoops static int static int static int static Console N = int Console K = static int 0 int Console Console return for 1 1 static for 0 Console {0} Console

10 336 N=2 ve K=4 için uygulama çıktısı aşağıdaki gibidir: 10.9 İç içe Döngüler - Yinelemeli Yaklaşım İç içe geçmiş döngülerin yinelemeli bir çözümünün uygulanması için, bir sonraki sayı dizisini bulan ve her yinelemede yazdıran aşağıdaki algoritmayı kullanabiliriz: 1. Her pozisyon başına 1 sayısını yerleştirin. 2. Mevcut sayı dizisini bastırın. 3. N pozisyon numarasını 1 artırdıktan sonra elde ettiğiniz değer K yı aşmışsa, onu tekrar 1 e eşitleyin ve N-1 pozisyonundaki değeri 1 ile artırın. Bu değer de K yı aşmışsa, onu tekrar 1 e eşitleyin ve N-2 pozisyonundaki değeri 1 ile artırın, ve bu böyle devam eder. 4. İlk pozisyon değeri K yı aştığı takdirde, algoritma sonlanır. 5. Adım 2 ile devam edin. Açıkladığımız yinelemeli iç içe döngüler algoritmasının uygulaması aşağıda sunulmuştur:

11 337 using class IterativeNestedLoops int void Console N = int Console K = int int Console Console void int while true if 0 return 1 void int 0 1

12 338 static int 0 Console 0 Console Main() ve PrintLoops() metotları özyinelemeli uygulamadaki gibidir. NestedLoops() metotu yinelemeli ve parametresiz olarak çalıştığı için farklı uygulanmalıdır. Metotun en başında, InitLoops() metotuna bir çağrı yapılarak dizinin her pozisyonu için 1 atanır. Algoritmanın adımları çalışırken sonsuz döngüden metotların return deyimi ile çıkar. Algoritmanın 3.adımını uygulamak oldukça ilginçtir. K nın üzerindeki değerlerin kontrolü, 1 e eşitlenmeleri, ve bir önceki pozisyonun değerinin 1 ile artırılması (aynı kontrolü onun için de gerçekleştirdikten sonra) ardından K yı aşan değerler için while döngüsüne girilir. Mevcut pozisyon değeri bu amaçla 1 e eşitlenir. Bunun sonrasında bir önceki pozisyon geçerli olur. Ardından geçerli pozisyonun değeri 1 e eşitlenir ve döngünün başlangıcına dönülür. Bu eylemler mevcut pozisyon değeri K veya daha az iken devam eder. K yı aşınca (numberofiterations değişkeni K değerine erişince) sona erer. İlk pozisyon değeri K yı aşınca, döngü K defa çalışmıştır. Çıktının devamlılığını sağlayabilmek için (sonsuz döngüye devam etmek için) sayı dizisinin bir sonraki elemanı tekrar 1 e eşitlenir ve bu anda bu alt döngünün yinelenme sayısı K yı tükettiği için geçerli pozisyon (currentposition) 0 dan az ve negatif bir değer almıştır. Dizi endeksi negatif değer alamayacağı için bir if-kontrol deyimi içindeki return ile alt döngüden çıkılır. N=3 ve K=2 için uygulamayı test edebiliriz:

13 Hangisi Daha İyi: Özyineleme veya Yineleme? Eğer problem çözme algoritması özyinelemeli ise, özyinelemeli çözüm uygulaması aynı problem için geliştirilebilecek bir yinelemeli çözüm uygulamasından çok daha okunaklıdır ve tercih edilir. Eşdeğer bir algoritmanın tanımlanması ve algoritmaların eşdeğerliliklerini kanıtlamak bazen zor olabilir. Özyineleme kullanarak belirli durumlarda çok daha basit, daha kısa ve kolay çözümler sunmayı başarabiliriz. Öte yandan, özyinelemeli çağrılar çok daha fazla kaynak tüketebilir (CPU zamanı ve bellek). Her özyinelemeli çağrı için ayrıca yığında, metota giren ve/veya çıkan argümanlar, yerel değişkenler ve döndürülen değerleri saklayan yeni bellek alanları ayrılmalıdır. Çok fazla özyinelemeli çağrılar bir yan etki olarak bellek akıntısına neden olabilir. Özyinelemeli çözümler, bazı durumlarda, eşdeğer yinelemeli çözümlerinden daha zor okunabilir ve anlaşılabilir. Özyineleme güçlü bir programlama tekniğidir, ancak dikkatli analiz edilmelidir. Yanlış kullanımında, çözümlerin anlaşılması ve bakımı zorlaşır.! Eğer özyineleme kullanarak daha basit, daha kısa ve daha kolay bir çözüme varırsanız tercih edilebilir. Aksi takdirde, yinelemeli bir çözüm düşününüz.

14 340 Aşağıda özyinelemenin doğru kullanımını gösteren bir uygulama verilmiştir: RecursiveFibonacciMemoization static long static Console n = int int Console long long Console fib({0}) = {1} static int 1 2 return

15 341 Main() ve PrintLoops() metotları özyinelemeli uygulamadaki gibidir. NestedLoops() metotu yinelemeli ve parametresiz olarak çalıştığı için farklı uygulanmalıdır. Metotun en başında, InitLoops() metotuna bir çağrı yapılarak dizinin her pozisyonu için 1 atanır. Algoritmanın adımları çalışırken sonsuz döngüden metotların return deyimi ile çıkar. Algoritmanın 3.adımını uygulamak oldukça ilginçtir. K nın üzerindeki değerlerin kontrolü, 1 e eşitlenmeleri, ve bir önceki pozisyonun değerinin 1 ile artırılması (aynı kontrolü onun için de gerçekleştirdikten sonra) ardından K yı aşan değerler için while döngüsüne girilir. Mevcut pozisyon değeri bu amaçla 1 e eşitlenir. Bunun sonrasında bir önceki pozisyon geçerli olur. Ardından geçerli pozisyonun değeri 1 e eşitlenir ve döngünün başlangıcına dönülür. Bu eylemler mevcut pozisyon değeri K veya daha az iken devam eder. K yı aşınca (numberofiterations değişkeni K değerine erişince) sona erer. İlk pozisyon değeri K yı aşınca, döngü K defa çalışmıştır. Çıktının devamlılığını sağlayabilmek için (sonsuz döngüye devam etmek için) sayı dizisinin bir sonraki elemanı tekrar 1 e eşitlenir ve bu anda bu alt döngünün yinelenme sayısı K yı tükettiği için geçerli pozisyon (currentposition) 0 dan az ve negatif bir değer almıştır. Dizi endeksi negatif değer alamayacağı için bir if-kontrol deyimi içindeki return ile alt döngüden çıkılır. N=3 ve K=2 için uygulamayı test edebiliriz: Gözle görülür bir fark vardır. Önceki örnekte n=100 için sonsuza giden bir hesaplama nedeniyle sonuç uzun zaman sonra hesaplanırken, optimize edilmiş çözüm ile sonuç hemen hesaplanıyor. Daha sonraki Veri Yapıları ve Algoritma Karmaşıklığı Bölümü nde not edileceği üzere, birinci çözüm üssel, ikinci çözüm doğrusal zamanda çalışmaktadır.

16 Fibonacci Sayıları Özyinelemenin Yanlış Kullanımı Bir Fibonacci dizisinin n.elemanını bulduğumuz örneğe yeniden göz atalım ve özyinelemeli çözüme daha dikkatli olarak yaklaşalım. 2 int return 1 return 1 2 Bu çözüm, sezgisel, kısa ve anlaşılırlığı yüksektir. İlk bakışta özyinelemenin iyi uygulanabileceği bir örnekmiş gibi görünüyor. Ancak gerçekte, özyinelemenin kullanımına dair doğru olmayacak bir örnektir. Nedenini açıklamak gerekirse, özyinelemeli uygulamayı aşağıdaki şekilde geliştirdiğimizi düşünelim: RecursiveFibonacci static Console n = int int Console long Console fib({0}) = {1} static int 2 return 1 return 1 2

17 343 n=100 için, hesaplamalar kimsenin beklemeyi göze almayacağı kadar uzun süreceği için uygulama son derece verimsiz olacaktır. Özyinelemeli her çağrı için iki özyinelemeli çağrı daha yapılıyor. Çağrılar, bu nedenle, aşağıdaki şekilde gösterildiği gibi katlanarak büyümektedir. fib(100) hesaplanması için gerekli adımlar 100 üssü 1,6 mertebesindedir, matematiksel olarak bu sayı kanıtlanmıştır. Buna rağmen, çözüm doğrusal olsaydı, bu sayı 100 olacaktı. Nedeni, çok fazla hesap gerektirmesindendir. Aşağıdaki Fibonacci ağacından da görülebileceği gibi, fib(2) sayısı birden fazla yerde göze çarpmaktadır Fibonacci Sayıları Özyinelemenin Doğru Kullanımı Fibonacci sayılarının hesaplanması için özyinelemeli metotu optimize etmenize yardımcı olabiliriz. Dizide zaten hesaplanan sayıları hatırlayarak (saklayarak) ve ancak eğer sayı henüz hesaplanmamışsa özyinelemeli çağrıyı yapmaya hazırlanmakla optimizasyon sağlanabilir. Bilgisayar bilimlerinde dinamik optimizasyon veya memoizasyon olarak bilinen bu optimizasyon tekniği sayesinde (hafıza teknikleri ile karıştırmayınız), özyinelemeli çözüm adımları doğrusal bir sayı kadar yinelendikten sonra sona erer.

18 344 Aşağıda özyinelemenin doğru kullanımını gösteren bir uygulama verilmiştir: RecursiveFibonacciMemoization static long static Console n = int int Console long long Console fib({0}) = {1} static int 1 2 return Gözle görülür bir fark vardır. Önceki örnekte n=100 için sonsuza giden bir hesaplama nedeniyle sonuç uzun zaman sonra hesaplanırken, optimize edilmiş çözüm ile sonuç hemen hesaplanıyor. Daha sonraki Veri Yapıları ve Algoritma Karmaşıklığı Bölümü nde not edileceği üzere, birinci çözüm üssel, ikinci çözüm doğrusal zamanda çalışmaktadır.

19 Fibonacci Sayıları Yinelemeli Çözüm Fibonacci sayılarının ardışık hesaplanmasıyla özyineleme kullanmadan problemi çözmenin de mümkün olabileceğini fark etmişsinizdir. Bu amaçla dizinin sadece son iki elemanı saklanır ve bir sonraki elemanın değerini hesaplamak için saklanan değerler kullanılır. Fibonacci sayılarını yinelemeli hesaplayan algoritmanın bir uygulaması aşağıda verilmiştir: IterativeFibonacci static Console n = int int Console long Console fib({0}) = {1} static int long 0 long 1 long 1 for 2 return Bu çözüm kısa ve zarif görünüyor, verimlidir ve fazla bellek gerektirmez, ancak yine de özyineleme için varolan riskleri tamamen yok etmiyor. Bir başka öneriyle önceki örnekleri sonuçlandıralım:! Özyineleme güçlü bir programlama tekniğidir, fakat çalışması ve etki alanı hakkında yeterli bilgiye sahip olunmadığı sürece ne olduğunu fark edemeyebilir ve kendi bindiğiniz dalı kesebilirsiniz. Bu da yanlış programlamaya neden olacağı için dikkatle kullanmalısınız!

20 346 Eğer bu kuralı uygularsanız, özyinelemenin yanlış kullanım olasılığı azalır ve sonuçlarından etkilenmezsiniz Özyineleme ve Yineleme Daha Fazlası Doğrusal hesaplama gerektiren süreçler için özyineleme kullanmak genellikle zorunlu değildir, çünkü yinelemeyle sonuçlar kolayca bir araya getirilebilir, bu basit ve etkili bir hesaplama tekniğidir. Örneğin, doğrusal işlem gerektiren faktöriyel hesaplama probleminde, bir sonraki elemanın değeri sadece önceki gelen tüm elemanlara bağlıdır. Doğrusal hesaplama işlemlerinin karakteristik özelliği, her adımda sadece bir kere özyineleme çağrısı ile hesabın sadece bir yönde ilerlenerek tamamlanabilmesidir. Doğrusal hesaplama sürecini şematik olarak şu şekilde tanımlayabiliriz: void Metot gövdesinde sadece bir kere özyinelemeli çağrı yapılmışsa özyineleme kullanmak gerekli değildir, çünkü yineleme anlaşılır ve barizdir. Bununla birlikte, bazen, dallanmış bir hesaplama süreci (ağaç gibi) ile yüz yüze kalırız. Örneğin, N iç içe geçmiş döngülerin taklit edilmesi, yinelemeyle kolayca ifade edilemez. Muhtemelen, iç içe geçmiş döngüleri taklit eden yinelemeli algoritmamızın tamamen farklı bir prensipte çalıştığını fark etmişsinizdir. Aynı şeyi yineleme olmadan uygulamayı deneyin ve kolay olmadığını göreceksiniz. Normalde, her özyineleme, (programın yürütülmesiyle oluşturulan) çağrı yığınını kullanarak yinelemeye dönüşebilir, ancak bu karmaşıktır ve bunu yapmanın hiçbir yararı yoktur. Özyineleme, belirgin bir yinelemeli çözüme sahip olmadığımız bir problem için basit, anlaşılması kolay ve etkili bir çözüm sağlaması durumunda kullanılmalıdır. Yinelemenin her adımında ağaç benzeri (dallı) hesaplama süreçlerinde birkaç özyinelemeli çağrı yapılır ve hesaplamanın şeması ağaç olarak görülebilir (doğrusal hesaplamalarda olduğu gibi bir liste değil). Örneğin, Fibonacci sayılarını hesapladığımızda özyinelemeli çağrı ağacının nasıl olacağını gördük.

21 347 Ağaç benzeri dallara sahip bir hesaplama sürecinin şematik gösterimi aşağıdaki gibidir: void Ağacın hesaplama süreçleri (doğrusal süreçlerin aksine) doğrudan özyinelemeli olarak ifade edilemez. Fibonacci için durum basittir, Çünkü her bir sonraki sayı önceki sayıya bakarak hesaplanabilir. Bazen, her sonraki sayı, yalnızca önceki yoluyla hesaplanmaz, bir sonraki sayı da gereklidir, ve özyinelemeli bağımlılık o kadar basit değildir. Bu durumda memoizasyon tekniğini uygulayarak yinelenen hesaplamalardan kaçındığınız takdirde, özyineleme doğru olarak uygulanırsa, çok verimli sonuç verir.! Dallı özyinelemeli hesaplamalar için özyineleme kullanın (ve her bir değerin yalnızca bir kez hesaplandığından emin olun). Doğrusal özyinelemeli hesaplamalar için özyinelemeyi tercih edin. Son ifadeyi klasik bir örnekle göstereceğiz Labirentte İz Sürmek Örnek N x M kapıdan oluşan dikdörtgen şekilli bir labirent veriliyor. Kapıların her biri geçilir veya geçilmez özelliklidir. Sol üst köşesinden labirente giren bir kimse, sağ alt köşeye ulaşmak istiyor. Kişi yukarı, aşağı, sağa veya sola yöne bir seferde bir kapı hareket edebilir. Bir kapıdan geçildiğinde, geri dönüş yapılmaksızın tekrar aynı kapıdan geçilmesi yasaktır. Ancak kapı serbest hale gelebilirse geçilebilir. Sağ alt köşeye ulaşıldığına yol tamamlanıyor. Labirente giren bir kişinin girişten çıkışa kadar izlediği tüm yolları görüntülemek istiyoruz.

22 348 Özyineleme kullanılarak çözülebilen problemlere tipik bir örnektir. Bu problemin yineleme ile çözümü daha karmaşık ve uygulaması zor olacaktır. Şekiller üzerinden problemi anlamaya çalışınız: Belirtimleri yerine getiren girişten çıkışa 3 ayrı yol olduğunu görebilirsiniz. (sadece geçerli kapılardan geçilmiştir ve aynı kapıdan iki kere geçilmemiştir). Bu 3 yol aşağıda izlenmiştir: Yukarıdaki şekillerde sayılar yolu izlerken kaç defa dönüş yapıldığına işaret ediyor.

23 Labirent Yolları Özyinelemeli Algoritma Bu problemi nasıl çözeriz? Labirentin herhangi bir pozisyonundan sonuna kadar arama işlemini bir özyinelemeli süreç olarak aşağıda gibi tanımlayabiliriz: 1. Başlangıç pozisyonu (0,0) olmak üzere, labirentin geçerli konumu (row, col) olsun. 2. Mevcut konum (N-1, M-1) ise hedefe varılmıştır. Aranan çıkış sağlanmıştır. 3. Kapı geçilmezse, geri gideriz (durma hakkımız yoktur). 4. Pozisyon daha önce ziyaret edilmişse, geri gideriz (iki kere geçme hakkımız yoktur). 5. Bunların dışında, 4 özyineleme sözkonusudur: Sağa gidiş: (row, col + 1) Aşağı gidiş: (row + 1, col) Yukarı gidiş: (row 1, col) Sola gidiş: (row, col - 1) Bu algoritma çözümünü analiz ederken özyinelemeli düşünmeliyiz. Problem cümlesi verilen bir pozisyondan çıkışa giden yolu bulmaktır. Alt problemlere bölünmesi gerekirse: geçerli konumun bir sağındaki pozisyondan çıkışa giden yolu aramak geçerli konumun bir aşağısındaki pozisyondan çıkışa giden yolu aramak geçerli konumun bir yukarısındaki pozisyondan çıkışa giden yolu aramak geçerli konumun bir solundaki pozisyondan çıkışa giden yolu aramak Ulaştığımız her olası konumdan dört muhtemel yönü kontrol edersek ve bir daire içerisinde hareket etmezsek (daha önce üzerine adım attığımız konumlardan geçmekten kaçınarak) er yada geç çıkış yolunu bulmalıyız (varsa). Bu sefer özyineleme önceki problemler kadar basit değildir. Her adımda çıkışa ulaşıp ulaşmadığımızı ve yasak bir konumda olup olmadığımızı kontrol etmeliyiz; Bundan sonra, bulunduğumuz pozisyonu ziyaret edilmiş olarak işaretlemeliyiz ve dört yönde aramayı özyinelemeli olarak çağırmalıyız. Özyinelemeli aramalardan döndükten sonra, başlangıç noktasını ziyaret edilmemiş olarak işaretlemeliyiz. Bu gibi gezinme, geriye doğru arama (backtracking) olarak bilinir.

24 Labirent Yolları Uygulama Algoritma uygulaması için uygun bir şekilde labirenti temsil etmeliyiz. İki boyutlu bir karakter dizisi kullanacağız. Geçilir pozisyonlar boşluk karakteri ile, çıkış pozisyonu e ile, geçilmez pozisyonlar * yıldız karakteri ile gösterilecek. Başlangıç pozisyonu geçilir pozisyondur. Ziyaret ettiğimiz pozisyonları s ile işaretleyeceğiz. Bir labirent temsili aşağıda verilmiştir: char * * * * * * * * * * e Labirent yollarının bulunması için özyinelemeli metotun uygulaması şöyle olacaktır:

25 351 char * * * * * * * * * * e // We are out of the labyrinth return // Check if we have found the exit e // Mark the current cell as visited s // Invoke recursion to explore all possible directions 1 // left 1 // up 1 // right 1 // down // Mark back the current cell as free 0 0

26 352 Uygulama yukarıdaki tanımı aynen gerçekleştirir. Bu durumda labirentin boyutları N ve M değişkenlerinde saklanmaz, ancak iki-boyutlu bir lab dizisi yardımıyla, labirentin sütun sayısı lab.getlength(1) ve satır sayısı lab.getlength(0) olmak üzere elde edilir. Arama yapan özyinelemeli metotun girişinde ilk koşul labirentin dışına çıkıp çıkmadığımızın kontrolüdür. Bu yasak durumda, labirentin sınırları dışına çıkılmaması için metot sonlandırıldı. Bundan sonra, çıkışı bulup bulmadığımızı kontrol etmeliyiz. Bulduysak, uygun bir mesaj yazdırıyoruz ve bulunduğunuz konumdan ileriye doğru aramayı sonlandırıyoruz. Sonra, mevcut karenin kullanılabilir olup olmadığını kontrol ediyoruz. Eğer pozisyon geçerliyse, ve önceki adımların bazılarında bu kareye basmadıysak (başlangıç pozisyonundan labirentin mevcut hücresine kadar olan mevcut yolun bir parçası değilse), mevcut kare kullanılabilir. Eğer hücre mevcutsa, üzerine basarız. Tanım gereği bu hücreyi s karakteriyle işaretleyerek ziyaret edilmiş olarak kaydetmeliyiz. Bundan sonra dört olası yönde özyinelemeli olarak bir yol ararız. Bu dört özyinelemeli arama çağrısından geri dönüldüğünde, geçerli hücreden geri adım atarak, mevcut hücre ile işaretlenerek serbest bırakılır. Geçerli konumun serbest bırakılması önemlidir, çünkü geri döndüğümüzde mevcut yolun bir parçası değildir. Bu belirtimi atlarsanız, yolların hepsi değil, ancak bazıları bulunmuş olabilir. Labirentin çıkış yollarını bulmak için uygulanan özyinelemeli metot bu şekilde özetlenmiştir. Şimdi sadece bu metotu (0, 0) başlangıç pozisyonundan başlatarak Main() metotu içinden çağırmalıyız. Program yürütüldüğünde aşağıdaki sonucu döndürür: Çıkışın tam üç kez bulunduğunu görebilirsiniz. Algoritma düzgün çalışıyor gibi görünüyor; ancak daha anlamlı olabilmesi için çıkış yolunu yazdırmamız gerekiyor.

27 Labirent Yolları İz Kayıtları Özyinelemeli algoritma ile bulduğumuz yolları yazdırmak için, her adımda atılan adım yönünü saklayacak bir diziye ihtiyacımız var: sağ R (right), aşağı D (down), yukarı U (up), sol L (left). Bu dizi her an için labirentin başından itibaren geçerli yolu tutacak. Bir karakter dizisi ve sayaç yardımıyla, şu anki özyineleme derinliğini, yani özyinelemeli olarak kaç pozisyon ilerlediğimizi tutabiliriz. Özyinelemeye her girişte sayaç 1 artırılmalıdır. Dönüşte 1 azaltılmalıdır. Çıkış yolu bulunduğunda, yazdırılması için gerekli veriler hazırdır (0 ile başlayan ve sayaç endeksine kadar olan dizinin tüm karakterleri). Dizinin boyutları ne olmalıdır? Bu sorunun cevabı kolaydır; bir hücreye en fazla bir kere girilebildiğine göre en uzun yol N * M kadardır. Örneğimizdeki labirent 7 * 5 boyutlarında olduğu için dizinin en fazla uzunluğu 35 kabul edilmelidir. Not: List<T> veri yapısını biliyorsanız, karakter dizisi yerine List<char> kullanmanız daha uygun olabilir. Listeleri daha detaylı olarak Doğrusal Veri Yapıları Bölümü nde öğreneceksiniz. Açıklanan fikrin uygulanması aşağıda verilmiştir:

28 354 char * * * * * * * * * * e // We are out of the labyrinth return // Append the direction to the path // Check if we have found the exit e // The current cell is free. Mark it as visited s // Invoke recursion to explore all possible directions 1, L // left 1 U // up 1, R // right 1 D // down // Mark back the current cell as free // Remove the last direction from the path

29 355 static void char[] int Console Found path to the exit: Console Console. void S Labirentin çıkış yolunu arayan özyinelemeli metota bir parametre daha ekledik: geçerli konuma ulaşmak için kullandığımız yönü belirtir imleç : R, D, U, L. Bu parametre başlangıç pozisyonundan geçerken S değerine sahiptir. Ancak bu bir anlam taşımaz. Yolu yazdırırken, bu ilk elemanı atlarız. Programı başlatırsak, labirentin başından sonuna kadar üç yol bulunur: Labirent Yolları Programın Test Edilmesi Algoritma düzgün çalışıyor gibi görünüyor. Biraz daha fazla örnek ile test etmek hatasız çalıştığını gösterecektir. 1x1 boş labirent ile programı test edebilirsiniz, 3 x 3 boş labirent ile, yada çıkış yolu olmayan bir labirent ile ve birçok yola sahip boyutları büyük bir labirent ile test edebilirsiniz. Bu testler her durumda programın düzgün çalıştığına sizi ikna edecektir.

30 356 Örnek girdi (1 x 1 boş labirenti): char e Örnek çıktı: Çıktıdaki yol beklendiği gibi boştur (uzunluğu 0 dır), çünkü başlangıç pozisyonu çıkışla aynıdır. Bu durumda görselleştirmeyi geliştirmek isteyebilirsiniz ( Yol boştur yazdırmak, vs.) Örnek girdi ( 3 x 3 boş labirenti): char e

31 357 Yukarıdaki örnek labirentin çıktısı: Çıktının doğru olduğunu kabul edebilirsiniz - bunlar tüm çıkış yollarıdır. Bir başka örnek girdi (çıkışı olmayan 5x3 labirenti): char * * * * * e Çıktısı: (çıkış yok) Çıktının doğru olduğunu görebilirsiniz, ancak yine de herhangi bir çıktı yerine daha anlamlı bir mesaj ekleyebilirsiniz (örneğin, Çıkış yok! ).

32 358 Şimdi çok büyük bir labirent için programa bakalım: Örnek girdi (15x9 labirenti): char Program çalıştırıldığında çıkış yollarını yazdırmaya başlar, ancak sonlanmayacaktır çünkü çıkış yolları oldukça fazladır. Birkaç yol fazlası aşağıda verilmiştir:

33 359 Şimdi, son bir örnek için programı çalıştıralım: Örnek girdi (çıkışı olmayan 15 x 9 labirenti): char * * * * * * * * * * * * * * * * * * * * * e Program çalıştırıldığında çıktı yazdırmadan kilitleniyor. Çok uzun zamandır çalıştığı için sorun olabilir. Sorun nedir? Ortalama boyutu 20 olan bir labirent için 4 kere özyinelemeli çağrı vardır. Bunun anlamı 420 kere özyineleme çağrılır. Bu da programın aramasını tamamlayıp sonlanması için oldukça büyük bir rakamdır. Belki sayılar tam kesinlikte değildir, ancak programın çalışma zamanı hakkında bize bir fikir veriyor. Sonuç nedir? Değişkenler çok fazla olduğunda geriye doğru izleme yöntemi işe yaramaz. Bu sorun büyük bir labirentin tüm çıkış yollarını bulma problemi için geçerlidir. Çalışma zamanı sorununu çözmek için daha fazla enerji tüketmenizi istemeyeceğiz. Ancak şunu belirtmekte fayda vardır ki, problem tanımımızı çok az değiştirerek, yani örneğin sadece bir yol bulunmasını isteyerek, çalışma zamanı sorunundan sizi kurtarabiliriz. Programda geri dönülen yollar için özyinelemenin mevcut geçerli pozisyonunu serbest bırakmayarak bu değişikliği gerçekleştirebiliriz. Bu, aşağıdaki satırları koddan silmek demektir: // Mark back the current cell as free Bunun sonrasında program çok hızlı olarak çıkış olup olmadığına karar verir, ve varsa onu çabucak bulur. En kısa veya en uzun değil, sadece ilk yolu muhakkak bulacaktır.

34 Özyineleme Kullanımı Sonuçlar Labirentte çıkış yolu arama probleminden genel sonuç zaten formüle edilmiştir: Eğer özyinelemenin nasıl çalıştığını çok iyi anlamakta güçlük yaşıyorsanız, kullanmayınız! Özyinelemeli metotları yazarken dikkatli olunuz. Özyineleme en çok kombinasyon problemlerini çözmek için elverişli güçlü bir programlama tekniğidir; fakat yanlışlara neden olunabilir ve dikkatsiz kullanma nedeniyle herkese önerilmez. Programın sonlanamaması ve yığın taşmasına neden olması durumlarında, yinelemeli yaklaşımlarla probleme bir çözüm geliştirmeye, problemin tanımı analiz edildikten sonra karar verilmelidir. Örneğin, labirentte en kısa çıkış yolunu bulmak ile tanımlı problemi analiz ederseniz özyineleme kullanmadan, sadece (BFS) Breadth-First Search yardımıyla çözebilirsiniz. Kuyruk (queue) veri yapısı ile uygulamaları bulunan BFS algoritması Wavefront algoritması olarak da bilinir. makalesindeki BFS algoritması hakkında Wikipedia da daha fazla bilgi bulabilirsiniz.

35 361 Alıştırmalar 1. n iç içe döngüyü simüle eden bir program geliştirin. 2. k sınıfından n eleman için tüm çeşitlemeleri tekrarlarıyla listeleyen bir özyinelemeli program geliştirin. Örnek girdi: Çıktısı: Aynı görev için yinelemeli algoritma uygulayın. 3. n elemanlı bir küme içinden k elemanlı tüm kombinasyonları tekrarlarıyla listeleyen bir özyinelemeli program geliştirin. Örnek girdi: Çıktısı: Aynı görev için yinelemeli algoritma uygulayın. 4. Verilen bir sözcük dizisi ve k değeri için, sözcük dizisinin k elemanlı tüm öz alt kümelerini listeleyen özyinelemeli program geliştirin. Örnek girdi: Çıktısı: Aynı görev için yinelemeli bir algoritma uygulayın.

36 Verilen bir sözcük dizisi için, sözcük dizisinin tüm alt kümelerini listeleyen özyinelemeli program geliştirin. Örnek girdi: Çıktısı: Aynı görev için yinelemeli algoritma uygulayın. 6. Birleştirme-sıralama (merge-sort) algoritmasını özyinelemeli uygulayın. Bu algoritmaya girdi olarak verilen bir dizi önce iki eşit parçaya bölünür ve özyinelemeli olarak sıralanır. Sonrasında sıralanan parçalar bütün diziyi oluşturmak üzere birleştirilir. 7. Verilen bir n tamsayısı için 1, 2,, n sayılarının tüm permütasyonlarını listeleyen özyinelemeli program geliştirin. Örnek girdi: Çıktısı: Aynı görev için yinelemeli algoritma uygulayın. 8. Verilen bir tamsayı dizisi ve N sayısı için, dizideki sayıların toplamı N olan tüm alt kümelerini bulan özyinelemeli program geliştirin. Örneğin {2, 1, 3, -1} dizisi ve N=4 için, toplamı N=4 olan sayılar şöyle elde edilir: 4=2+3-1; 4= Verilen bir pozitif tamsayı dizisi için, elemanları toplamı S olan herhangi bir alt kümesinin olup olmadığını hesaplayan bir program geliştirin. Büyük diziler için program verimli çalışabilir mi? 10. Verilen iki pozisyon için, geçerli ve geçersiz kapıları olan bir labirent üzerinde iki pozisyon arasında bulunan tüm yolları hesaplayan bir program geliştirin. 11. Labirentin en kısa yolunu bulmak için BFS (breadth-first search) algoritmasını uygulayan bir program geliştirin.

37 İki pozisyon arasındaki tüm yolları hesaplayan bir önceki alıştırmada istenen programı iki pozisyon arasında bir yol olup olmadığını kontrol edecek şekilde değiştirin. 13. Geçerli ve geçersiz kapıları olan verilen bir labirent için tek doğrultuda yol dönüş yapmaksızın, başka tarafa sapmaksızın, komşu ve ardışık pozisyonlardan oluşan en büyük alanı hesaplayan program geliştirin. 14. C:\ hard diski içindeki tüm klasör ve dosyaları ziyaret eden ve özyinelemeli listeleyen bir program geliştirin.

ALGORİTMA ANALİZİ. Cumhuriyet Üniversitesi Bilgisayar Mühendisliği Bölümü

ALGORİTMA ANALİZİ. Cumhuriyet Üniversitesi Bilgisayar Mühendisliği Bölümü ALGORİTMA ANALİZİ Cumhuriyet Üniversitesi Bilgisayar Mühendisliği Bölümü 2 Özyinelemeler veya artık teknik Türkçeye girmiş olan rekürsiflik en çok duyulan fakat kullanımında zorluklar görülen tekniklerdendir.

Detaylı

Yrd. Doç. Dr. A. Burak İNNER Bilgisayar Mühendisliği

Yrd. Doç. Dr. A. Burak İNNER Bilgisayar Mühendisliği Yrd. Doç. Dr. A. Burak İER Bilgisayar Mühendisliği Algoritma Analizi İçerik: Temel Kavramlar Yinelemeli ve Yinelemesiz Algoritma Analizi Asimptotik otasyonlar Temel Kavramlar Algoritma: Bir problemin çözümüne

Detaylı

BİLGİSAYAR PROGRAMLAMA. Algoritma ve Akış Şemaları

BİLGİSAYAR PROGRAMLAMA. Algoritma ve Akış Şemaları BİLGİSAYAR PROGRAMLAMA Algoritma ve Akış Şemaları Algoritma tanımı Algoritma özellikleri Algoritma tasarımı Akış şemaları Dallanma simgeleri Döngü simgeleri Akış şeması tasarımı Akış şeması örnekleri Konu

Detaylı

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

ELN1002 BİLGİSAYAR PROGRAMLAMA 2 ELN1002 BİLGİSAYAR PROGRAMLAMA 2 SIRALAMA ALGORİTMALARI Sunu Planı Büyük O Notasyonu Kabarcık Sıralama (Bubble Sort) Hızlı Sıralama (Quick Sort) Seçimli Sıralama (Selection Sort) Eklemeli Sıralama (Insertion

Detaylı

ALGORİTMA VE PROGRAMLAMA I

ALGORİTMA VE PROGRAMLAMA I ALGORİTMA VE PROGRAMLAMA I YZM 1101 Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi Genel Bakış 2 Giriş Fonksiyonlara Genel Bakış C ve Fonksiyonlar Fonksiyon Tanımı 8. BÖLÜM 3 Fonksiyonlar

Detaylı

Algoritmalar ve Programlama. Algoritma

Algoritmalar ve Programlama. Algoritma Algoritmalar ve Programlama Algoritma Algoritma Bir sorunu / problemi çözmek veya belirli bir amaca ulaşmak için gerekli olan sıralı mantıksal adımların tümüne algoritma denir. Algoritma bir sorunun çözümü

Detaylı

NESNEYE YÖNELİK PROGRAMLAMA

NESNEYE YÖNELİK PROGRAMLAMA NESNEYE YÖNELİK PROGRAMLAMA Metotlar Şu ana kadar yaptığımız örneklerde hep önceden hazırlanmış ReadLine(), WriteLine() vb. gibi metotları kullandık. Artık kendi metotlarımızı yapmanın zamanı geldi. Bilmem

Detaylı

HSancak Nesne Tabanlı Programlama I Ders Notları

HSancak Nesne Tabanlı Programlama I Ders Notları DİZİLER Bellekte ard arda yer alan aynı türden nesneler kümesine dizi (array) denilir. Bir dizi içerisindeki bütün elemanlara aynı isimle ulaşılır. Yani dizideki bütün elemanların isimleri ortaktır. Elemanlar

Detaylı

elemanlarının gezilmesine yönelik bir örnek sunulmuştur, inceleyiniz.

elemanlarının gezilmesine yönelik bir örnek sunulmuştur, inceleyiniz. Ön bilgi: Dizi tanımlayabilmeli. foreach deyimi bilinmeli. Rastgele sayılar (Random) bilinmeli. 1. Aşağıda tamsayı tipinde iki boyutlu bir dizinin nasıl tanımlandığı, bir fonksiyona parametre olarak nasıl

Detaylı

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) { Fonksiyonlar Kendi içinde bağımsız olarak çalışabilen ve belli bir işlevi yerine getiren program modülleridir. C programları bu modüllerden (fonksiyonlar) oluşurlar. Fonksiyonların yazılmasındaki temel

Detaylı

YZM ALGORİTMA ANALİZİ VE TASARIM DERS#3: ALGORİTMA ANALİZİ#2

YZM ALGORİTMA ANALİZİ VE TASARIM DERS#3: ALGORİTMA ANALİZİ#2 YZM 3207- ALGORİTMA ANALİZİ VE TASARIM DERS#3: ALGORİTMA ANALİZİ#2 Özyineli Olmayan (Nonrecursive) Algoritmaların Matematiksel Analizi En büyük elemanı bulma problemi En Büyük Elemanı Bulma Problemi Girdi

Detaylı

ALGORİTMA VE PROGRAMLAMA I

ALGORİTMA VE PROGRAMLAMA I ALGORİTMA VE PROGRAMLAMA I Yrd. Doç. Dr. Deniz KILINÇ deniz.kilinc@cbu.edu.tr YZM 1101 Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi Genel Bakış 2 Giriş Fonksiyonlara Genel Bakış C

Detaylı

DÖNGÜLER BMÜ-111 ALGORİTMA VE PROGRAMLAMA-I YRD. DOÇ. DR. İLHAN AYDIN

DÖNGÜLER BMÜ-111 ALGORİTMA VE PROGRAMLAMA-I YRD. DOÇ. DR. İLHAN AYDIN DÖNGÜLER BMÜ-111 ALGORİTMA VE PROGRAMLAMA-I YRD. DOÇ. DR. İLHAN AYDIN GİRİŞ Ekrana «Merhaba Java» şeklinde bir mesajı 100 defa yazmak istediğinizi düşünelim. Aşağıdaki komut satırını 100 kez yazmak sıkıcı

Detaylı

Alıştırma 1: Yineleme

Alıştırma 1: Yineleme Alıştırma 1: Yineleme Alıştırma 2: Yineleme H10->H2 çevrimini yapınız 7 2 1 3 2 1 1 1 2 0 Hafta 3: Yineleme Alıştırmaları(1) E1. (44/174) S değerini yineleme kullanarak hesap ediniz S = 1 + 2 + 3 + n Hafta3:

Detaylı

DÖNGÜLER (LOOPS) while(), do-while(), for(), foreach()

DÖNGÜLER (LOOPS) while(), do-while(), for(), foreach() (LOOPS) while(), do-while(), for(), foreach() Döngüler (loops) while do-while for foreach while ( koşul ) işlemler; do işlemler; while (koşul ); for (başlangıç ; koşul ; arttırma) işlemler; foreach ( tip

Detaylı

EM205 26/9/2014. Programlamaya giriş Algoritmalar. Amaçlar

EM205 26/9/2014. Programlamaya giriş Algoritmalar. Amaçlar EM205 26/9/2014 Programlamaya giriş Algoritmalar Temel kavramlar Algoritmalar Amaçlar Algoritma kavramını öğrenmek, Algoritmaları ifade edebilmek, Temel matematiksel algoritmaları yazabilmek C programlama

Detaylı

Özyineleme (Recursion)

Özyineleme (Recursion) Özyineleme tanımlamaları Özyineleme çağırma Tail özyineleme Nontail özyineleme Dolaylı (Indirect) özyineleme İçiçe (Nested) özyineleme Yrd.Doç.Dr. M. Ali Akcayol Kendi kendisini doğrudan veya dolaylı olarak

Detaylı

BİLGİSAYAR PROGRAMLAMA DERSİ

BİLGİSAYAR PROGRAMLAMA DERSİ BİLGİSAYAR PROGRAMLAMA DERSİ 5. DERS NOTU Konu: Döngü Yapıları Hazırlayan: Yrd. Doç. Dr. Ahmet DUMLU DÖNGÜ YAPILARI Birçok uygulamada bazı işlemlerin tekrar tekrar gerçekleştirilmesi gerekir. Bizlere bu

Detaylı

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak. Selçuk Üniversitesi Mühendislik Fakültesi Harita Mühendisliği Bölümü Final Sınavı Test Soruları dı soyadı :... Öğrenci no :... İmza :... Tarih, Süre :09.01.2013, 60 dak. Dikkat!!! Soru kitapçığında ve

Detaylı

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO while(), do-while(), for() Döngü (loop) : Bir koşul sağlandığı (true olduğu) sürece bir veya birden çok komutun tekrarlanması işlemidir. Java Döngüler (loops) While() do-while() for ( ) while ( koşul )

Detaylı

3.Hafta Master Teorem ve Böl-Fethet Metodu

3.Hafta Master Teorem ve Böl-Fethet Metodu 1 3.Hafta Master Teorem ve Böl-Fethet Metodu 2 Ana Metod (The Master Method) Ana method aşağıda belirtilen yapıdaki yinelemelere uygulanır: T(n) = at(n/b) + f (n), burada a 1, b > 1, ve f asimptotik olarak

Detaylı

MAK 1005 Bilgisayar Programlamaya Giriş. Fonksiyonlar. Prof. Dr. Necmettin Kaya

MAK 1005 Bilgisayar Programlamaya Giriş. Fonksiyonlar. Prof. Dr. Necmettin Kaya MAK 1005 Bilgisayar Programlamaya Giriş Fonksiyonlar Prof. Dr. Necmettin Kaya Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır. Daha büyük programlar yazmanın en

Detaylı

ÜNİT E ÜNİTE GİRİŞ. Algoritma Mantığı. Algoritma Özellikleri PROGRAMLAMA TEMELLERİ ÜNİTE 3 ALGORİTMA

ÜNİT E ÜNİTE GİRİŞ. Algoritma Mantığı. Algoritma Özellikleri PROGRAMLAMA TEMELLERİ ÜNİTE 3 ALGORİTMA PROGRAMLAMA TEMELLERİ ÜNİTE 3 ALGORİTMA GİRİŞ Bilgisayarların önemli bir kullanım amacı, veri ve bilgilerin kullanılarak var olan belirli bir problemin çözülmeye çalışılmasıdır. Bunun için, bilgisayarlar

Detaylı

C PROGRAMLAMA YRD.DOÇ.DR. BUKET DOĞAN PROGRAM - ALGORİTMA AKIŞ ŞEMASI

C PROGRAMLAMA YRD.DOÇ.DR. BUKET DOĞAN PROGRAM - ALGORİTMA AKIŞ ŞEMASI C PROGRAMLAMA DİLİ YRD.DOÇ.DR. BUKET DOĞAN 1 PROGRAM - ALGORİTMA AKIŞ ŞEMASI Program : Belirli bir problemi çözmek için bir bilgisayar dili kullanılarak yazılmış deyimler dizisi. Algoritma bir sorunun

Detaylı

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Uzaktan Eğitim Uygulama ve Araştırma Merkezi JAVA PROGRAMLAMA Öğr. Gör. Utku SOBUTAY İÇERİK 2 Java da Fonksiyon Tanımlamak Java da Döngüler Java da Şart İfadeleri Uygulamalar Java da Fonksiyon Tanımlamak JAVA DA FONKSİYON TANIMLAMAK 4 Fonksiyonlar;

Detaylı

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta Ön bilgi: Özyineli fonksiyon tanımlanabilmeli. Dizilerin fonksiyon parametresi veya geri dönüş değeri olarak kullanımı bilinmeli. 1. Klavyeden girilen sayı n olmak üzere [1..n] aralığındaki sayıların toplamı

Detaylı

C++ Dersi: Nesne Tabanlı Programlama

C++ Dersi: Nesne Tabanlı Programlama C++ Dersi: Nesne Tabanlı Programlama Bölüm 6: Diziler İçerik Diziler Dizi Elemanlarına İlk Atama Diziler ve Fonksiyonlar İki Boyutlu Diziler İki Boyutlu Dizi Tanımı İki Boyutlu Dizi Elemanlarına Erişim

Detaylı

ELN1001 BİLGİSAYAR PROGRAMLAMA I

ELN1001 BİLGİSAYAR PROGRAMLAMA I ELN1001 BİLGİSAYAR PROGRAMLAMA I DEPOLAMA SINIFLARI DEĞİŞKEN MENZİLLERİ YİNELEMELİ FONKSİYONLAR Depolama Sınıfları Tanıtıcılar için şu ana kadar görülmüş olan özellikler: Ad Tip Boyut Değer Bunlara ilave

Detaylı

Programın Akışının Denetimi. Bir arada yürütülmesi istenen deyimleri içeren bir yapıdır. Söz dizimi şöyledir:

Programın Akışının Denetimi. Bir arada yürütülmesi istenen deyimleri içeren bir yapıdır. Söz dizimi şöyledir: Programın Akışının Denetimi Bir program komutların yazıldığı sırada akar. Ama çoğunlukla, bu akışı yönlendirmek gerekir. Bu iş için denetim yapılarını kullanırız. Bunlar iki gruba ayrılabilir: Yönlendiriciler

Detaylı

Yrd. Doç. Dr. Caner ÖZCAN

Yrd. Doç. Dr. Caner ÖZCAN Yrd. Doç. Dr. Caner ÖZCAN Diziler ile Pointer Arası İlişki Bir dizi adı sabit bir pointer gibi düşünülebilir. Diziler ile pointer lar yakından ilişkilidir. Pointer lar değişkenleri gösterdikleri gibi,

Detaylı

ÖZEL EGE LİSESİ FİBONACCİ DİZİLERİ YARDIMIYLA DEĞERİNİ HESAPLAYAN BİR FORMÜL

ÖZEL EGE LİSESİ FİBONACCİ DİZİLERİ YARDIMIYLA DEĞERİNİ HESAPLAYAN BİR FORMÜL ÖZEL EGE LİSESİ FİBONACCİ DİZİLERİ YARDIMIYLA DEĞERİNİ HESAPLAYAN BİR FORMÜL HAZIRLAYAN ÖĞRENCİ: Tilbe GÖKÇEL DANIŞMAN ÖĞRETMEN: Emel ERGÖNÜL İZMİR 2013 İÇİNDEKİLER 1. PROJENİN AMACI... 3 2. GİRİŞ... 3

Detaylı

Dr. Fatih AY Tel: 0 388 225 22 55 fatihay@fatihay.net www.fatihay.net

Dr. Fatih AY Tel: 0 388 225 22 55 fatihay@fatihay.net www.fatihay.net Bilgisayar Programlama Ders 9 Dr. Fatih AY Tel: 0 388 225 22 55 fatihay@fatihay.net www.fatihay.net Dizileri Fonksiyonlara Dizileri Fonksiyonlara Bir dizi argümanını fonksiyon içinde bir değer olarak kullanabilmek

Detaylı

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 7. Bölüm Metot Tanımlama ve Kullanma

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 7. Bölüm Metot Tanımlama ve Kullanma Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 7. Bölüm Metot Tanımlama ve Kullanma C Programlama Dr. Serkan DİŞLİTAŞ 7.1. Metot Kavramı Programlama dillerinde bütün kod satırlarının

Detaylı

Özyineleme (recursion)

Özyineleme (recursion) 2 Özyineleme (recursion) Kendi kendini çağıran fonksiyonlara özyineli (recursive) fonksiyon denilir. Özyineli fonksiyonlar, ileri bilgisayar uygulamalarında çok kullanılır. Bilgisayar biliminin zor sayılan

Detaylı

ALGORİTMA VE PROGRAMLAMA I

ALGORİTMA VE PROGRAMLAMA I ALGORİTMA VE PROGRAMLAMA I YZM 1101 Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi Genel Bakış 2 Diziler Dizi Nedir? Dizilerin Bildirimi Dizilere Başlangıç Değeri Verme Dizilerde Arama

Detaylı

ÖDEV (Vize Dönemi) CEVAPLAR. 1. Ekrana Merhaba Dünya! yazdıran algoritmanın akış diyagramını çiziniz ve sözde kod olarak yazınız.

ÖDEV (Vize Dönemi) CEVAPLAR. 1. Ekrana Merhaba Dünya! yazdıran algoritmanın akış diyagramını çiziniz ve sözde kod olarak yazınız. ÖDEV (Vize Dönemi) CEVAPLAR 1. Ekrana Merhaba Dünya! yazdıran algoritmanın akış diyagramını çiziniz ve sözde kod olarak yazınız. PROGRAM Soru1 PRINT Merhaba Dünya! ; 2. Klavyeden girilen negatif bir sayıyı

Detaylı

Algoritma ve Programlamaya Giriş

Algoritma ve Programlamaya Giriş Algoritma ve Programlamaya Giriş Algoritma Bir sorunu çözebilmek için gerekli olan sıralı ve mantıksal adımların tümüne Algoritma denir. Doğal dil ile yazılabilir. Fazlaca formal değildir. Bir algoritmada

Detaylı

BLM-431 YAPAY ZEKA. Ders-3 Durum Uzayında Arama. Yrd. Doç. Dr. Ümit ATİLA

BLM-431 YAPAY ZEKA. Ders-3 Durum Uzayında Arama. Yrd. Doç. Dr. Ümit ATİLA BLM-431 YAPAY ZEKA Ders-3 Durum Uzayında Arama Yrd. Doç. Dr. Ümit ATİLA umitatila@karabuk.edu.tr http://web.karabuk.edu.tr/umitatilla/ Dersin Hedefleri Durum uzayı temsilini öğrenmek ve durum uzayında

Detaylı

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz. C# da Diziler Diziler için aynı tipteki verilerin tutulduğu bir koleksiyon diyebiliriz. Örneğin integer verinin bir yığın şeklinde tutulması için dizileri kullanırız. C# da diziler referans tipinde değişkenlerdendir.

Detaylı

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say İÇİNDEKİLER 1. Bilgisayarın Yapısı Ve Programlama Dilleri Giriş 1 Bilgisayar ve Programlamanın Kısa Bir Tarihçesi 2 Donanım ve Yazılım Kavramları 3 Bilgisayarın Donanımsal yapısı 4 Giriş Birimi (Input

Detaylı

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers) 1 BLM 112- Programlama Dilleri II Hafta 5 İşaretçiler (Pointers) Dr. Öğr. Üyesi Caner Özcan Hiç hata yapmayan insan, hiçbir şey yapmayan insandır. Ve hayatta en büyük hata, kendini hatasız sanmaktır. ~Y.

Detaylı

MTK467 Nesneye Yönelik Programlama. Hafta 4 - Döngüler Zümra Kavafoğlu https://zumrakavafoglu.github.io/

MTK467 Nesneye Yönelik Programlama. Hafta 4 - Döngüler Zümra Kavafoğlu https://zumrakavafoglu.github.io/ MTK467 Nesneye Yönelik Programlama Hafta 4 - Döngüler Zümra Kavafoğlu https://zumrakavafoglu.github.io/ while döngüsü while(koşul){ } döngü ifadeleri Koşul boolean değerli olmalıdır. Koşulun değeri true

Detaylı

Toplama işlemi için bir ikili operatör olan artı işareti aynı zamanda tekli operatör olarak da kullanılabilir.

Toplama işlemi için bir ikili operatör olan artı işareti aynı zamanda tekli operatör olarak da kullanılabilir. www.csharpturk.net Türkiye nin C# Okulu Yazar Yunus Özen Eposta yunus@yunus.gen.tr Tarih 08.04.2006 Web http://www.yunusgen.tr ARİTMETİK OPERATÖRLER VE KULLANIM ŞEKİLLERİ Bilgisayarlar yapıları gereği,

Detaylı

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler BMÜ-111 Algoritma ve Programlama Bölüm 5 Tek Boyutlu Diziler Yrd. Doç. Dr. İlhan AYDIN 1 Problem 100 adet sayı okumak istediğimizi düşünelim. Bu sayıların ortalaması hesaplanacak ve sayıların kaç tanesinin

Detaylı

Dersin Sorumlusu: Yrd. Doç. Dr. Birol SOYSAL. Sunumları Hazırlayan: Doç. Dr. Bülent ÇAKMAK

Dersin Sorumlusu: Yrd. Doç. Dr. Birol SOYSAL. Sunumları Hazırlayan: Doç. Dr. Bülent ÇAKMAK MATLAB de Bilgisayar Programlama Dersin Sorumlusu: Yrd. Doç. Dr. Birol SOYSAL Sunumları Hazırlayan: Doç. Dr. Bülent ÇAKMAK disp komutu: Ekrana mesaj veya bir değişken değeri yazdırmak için kullanılan komuttur.

Detaylı

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA BLM-111 PROGRAMLAMA DİLLERİ I Ders-12 Fonksiyonlar Yrd. Doç. Dr. Ümit ATİLA umitatila@karabuk.edu.tr http://web.karabuk.edu.tr/umitatilla/ Fonksiyonlar Fonksiyonlar C de modüller Programlar kullanıcı tanımlı

Detaylı

Döngüler - Loops 4/9/2010. ENF-102 Jeoloji Giriş. Sayaç kontrollü bir döngüdeki temel öğeler. Sayaç (counter) Kontrollü Döngüler.

Döngüler - Loops 4/9/2010. ENF-102 Jeoloji Giriş. Sayaç kontrollü bir döngüdeki temel öğeler. Sayaç (counter) Kontrollü Döngüler. Giriş Döngüler - Loops Bir ifade kümesinin tekrarlanması, yani birden fazla çalıştırılması işlemine döngü (loop) dendiğiğ programlamaya giriş ş kısmında belirtilmişti. Bu derste döngülerin C programlama

Detaylı

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD Selçuk Üniversitesi, Mühendislik Fakültesi, Harita Mühendisliği Bölümü Yıliçi Sınavı Test Soruları Adı soyadı : Öğrenci no : Sınav tarihi : 13.04.2015 Süre : 60 dak. 1. Hangisi gerçek sayı değişmezi değildir?

Detaylı

Yrd. Doç. Dr. Caner ÖZCAN

Yrd. Doç. Dr. Caner ÖZCAN Yrd. Doç. Dr. Caner ÖZCAN Derse Giriş Ders Web Sitesi: www.canerozcan.net Ofis Saatleri: Salı 11:00-13:00 Perşembe 15:30-17:30 ya da email ile randevu alınız: canerozcan@karabuk.edu.tr Kaynak Kitaplar:

Detaylı

ALGORİTMA NEDİR? (Adım adım işlem basamaklarının yazılmasıdır.)

ALGORİTMA NEDİR? (Adım adım işlem basamaklarının yazılmasıdır.) PROGRAM YAZMAK SÜRECİ 1. Problemin farkına varmak, 2. Problemi analiz etmek, 3. Çözüm yolları düşünmek, 4. İyi çözüm yolları seçip algoritma oluşturmak, 5. Akış diyagramı çizmek, 6. Uygun bir dilde kodlamak,

Detaylı

YZM ALGORİTMA ANALİZİ VE TASARIM DERS#6: AZALT VE FETHET YÖNTEMİ

YZM ALGORİTMA ANALİZİ VE TASARIM DERS#6: AZALT VE FETHET YÖNTEMİ YZM 3207- ALGORİTMA ANALİZİ VE TASARIM DERS#6: AZALT VE FETHET YÖNTEMİ Azalt ve Fethet Algoritmaları Problemi daha küçük bir örneğine çevir: Küçük örneği çöz Çözümü asıl probleme genişlet 3 tipi vardır:

Detaylı

Akış Kontrol Mekanizmaları

Akış Kontrol Mekanizmaları Akış Kontrol Mekanizmaları 1 Akış Kontrol Mekanizmaları if else switch for döngüsü for döngüsünün çalışma prensibi for döngüsüyle ilgili örnekler for döngüsüyle ilgili kurallar while döngüsü while döngüsünün

Detaylı

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ (Algoritma Geliştirmek, Satır Kod)

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ (Algoritma Geliştirmek, Satır Kod) 2017-2018 BaharYarıyılı Balıkesir Üniversitesi Endüstri Mühendisliği Bölümü 3 BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ (Algoritma Geliştirmek, Satır Kod) Yrd. Doç. Dr. İbrahim Küçükkoç Web: ikucukkoc.baun.edu.tr

Detaylı

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları Diziler Temel Bilgisayar Programlama Final Sınavı Çalışma Notları (Dr. Övünç ÖZTÜRK, Dr. Tahir Emre KALAYCI) (İnşaat Mühendisliği ve Gıda Mühendisliği Grupları İçin) Diziler aynı türden bilgileri saklamak

Detaylı

BLM 111 ALGORİTMA VE PROGRAMLAMA I

BLM 111 ALGORİTMA VE PROGRAMLAMA I 1 BLM 111 ALGORİTMA VE PROGRAMLAMA I DİZİLER (ARRAYS) Kullanıcıdan N tane tamsayı, xi, alalım ve 1. Bu sayıların ortalamasını hesaplamak isteyelim ort = 0; for (i=0; i

Detaylı

Algoritma ve Akış Diyagramları

Algoritma ve Akış Diyagramları Algoritma ve Akış Diyagramları Bir problemin çözümüne ulaşabilmek için izlenecek ardışık mantık ve işlem dizisine ALGORİTMA, algoritmanın çizimsel gösterimine ise AKIŞ DİYAGRAMI adı verilir 1 Akış diyagramları

Detaylı

Algoritmalar. 3. Açıklık: Her işlem (komut) açık olmalı ve farklı anlamlar içermemeli.

Algoritmalar. 3. Açıklık: Her işlem (komut) açık olmalı ve farklı anlamlar içermemeli. Algoritmalar Kısaca algoritma belirli bir görevi yerine getiren sonlu sayıdaki işlemler dizisidir. Geniş anlamda ise algoritma, verilen herhangi bir sorunun çözümüne ulaşmak için uygulanması gerekli adımların

Detaylı

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ 2017-2018 BaharYarıyılı Balıkesir Üniversitesi Endüstri Mühendisliği Bölümü 5 BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ (Çoklu Koşul Yapıları, Sözde Kod, Algoritmalar Arasında Dönüşüm) Yrd. Doç. Dr. İbrahim

Detaylı

F(A, N, K) // A dizi; N, K integer if N<0 then return K; if A[N]>K then K = A[N]; return F(A, N-1, K);

F(A, N, K) // A dizi; N, K integer if N<0 then return K; if A[N]>K then K = A[N]; return F(A, N-1, K); 2009-2010 BAHAR DÖNEMİ MC 689 ALGORİTMA TASARIMI ve ANALİZİ I. VİZE ÇÖZÜMLERİ 1. a) Böl ve yönet (divide & conquer) tarzındaki algoritmaların genel özelliklerini (çalışma mantıklarını) ve aşamalarını kısaca

Detaylı

Binary Search. (Yarılama) Bölüm Dizide Bir Öğe Arama

Binary Search. (Yarılama) Bölüm Dizide Bir Öğe Arama Bölüm 39 Binary Search (Yarılama) 39.1 Dizide Bir Öğe Arama İkil aramayı (yarılama yöntemi) sıralı veri kümelerinde sık sık kullanırız. Örneğin, sözlükte bir sözcüğü ararken, sözlüğün bütün sayfalarını

Detaylı

Internet Programming I. Hafta III. Elbistan Meslek Yüksek Okulu Güz Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU

Internet Programming I. Hafta III. Elbistan Meslek Yüksek Okulu Güz Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU Internet Programming I Hafta III Elbistan Meslek Yüksek Okulu 2016 2017 Güz Yarıyılı Öğr. Gör. Murat KEÇECĠOĞLU Dönen Değer? Fonksiyonlar, kendilerini göreve çağıran VBScript komutlarına ve işlemlerine

Detaylı

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ Yrd.Doç.Dr. Emel ARSLAN earslan@istanbul.edu.tr C Program Akış Kontrol Yapıları Kontrol Komutları Normal şartlarda C dilinde bir programın çalışması, komutların

Detaylı

ALGORİTMA VE PROGRAMLAMA I

ALGORİTMA VE PROGRAMLAMA I ALGORİTMA VE PROGRAMLAMA I Yrd. Doç. Dr. Deniz KILINÇ deniz.kilinc@cbu.edu.tr YZM 1101 Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi Genel Bakış 2 Koşul Karşılaştırma Operatörleri Mantıksal

Detaylı

Sınav Dağılım & IMKB Endeks

Sınav Dağılım & IMKB Endeks Sınav Dağılım & IMKB Endeks Ege Üniversitesi Bilgisayar Mühendisliği Veri Yapıları Proje-1 Hüseyin YAŞAR 05-06-7657 Didem KAYALI 05-06-7669 Umut BENZER 05-06-7670 Özlem GÜRSES 05-07-8496 Sürüm: 0.2 Bölüm

Detaylı

Hafta 13 Fonksiyonlar

Hafta 13 Fonksiyonlar BLM111 Programlama Dilleri I Hafta 13 Fonksiyonlar Yrd. Doç. Dr. Caner ÖZCAN Fonksiyonlar Fonksiyonlar C de modüller Programlar kullanıcı tanımlı fonksiyonları ve kütüphane fonksiyonlarını birlikte kullanırlar.

Detaylı

public static int Toplam int x, int y

public static int Toplam int x, int y static Kavramı 1 İçinde bulunduğu sınıftan nesne oluşturulmadan veya hiç bir nesneye referans olmadan kullanılabilen üyeler static olarak nitelendirilir. Metotlar ve alanlar static olarak tanımlanabilir.

Detaylı

İÇERİK PROGRAMLAMAYA GİRİŞ ALGORİTMA AKIŞ DİYAGRAMLARI PROGRAMLAMA DİLLERİ JAVA DİLİNİN YAPISI JAVA DA KULLANILAN VERİ TİPLERİ JAVA DA PROGRAM YAZMA

İÇERİK PROGRAMLAMAYA GİRİŞ ALGORİTMA AKIŞ DİYAGRAMLARI PROGRAMLAMA DİLLERİ JAVA DİLİNİN YAPISI JAVA DA KULLANILAN VERİ TİPLERİ JAVA DA PROGRAM YAZMA İÇERİK PROGRAMLAMAYA GİRİŞ ALGORİTMA AKIŞ DİYAGRAMLARI PROGRAMLAMA DİLLERİ JAVA DİLİNİN YAPISI JAVA DA KULLANILAN VERİ TİPLERİ JAVA DA PROGRAM YAZMA BÖLÜM-II ALGORİTMA I. GİRİŞ Bilgisayar dünyasında, insanın

Detaylı

ÖZYİNELEME RECURSION. Doç. Dr. Aybars UĞUR

ÖZYİNELEME RECURSION. Doç. Dr. Aybars UĞUR ÖZYİNELEME RECURSION Doç. Dr. Aybars UĞUR GİRİŞ Kendini doğrudan veya dolaylı olarak çağıran fonksiyonlara özyineli (recursive) fonksiyonlar adı verilir. Özyineleme (recursion), iterasyonun (döngüler,

Detaylı

Yrd. Doç. Dr. Caner ÖZCAN

Yrd. Doç. Dr. Caner ÖZCAN Yrd. Doç. Dr. Caner ÖZCAN Fonksiyonu Referans ile Çağırma (Call by Reference) Bir fonksiyona gönderilen parametrenin normalde değeri değişmez. Fonksiyon içinde yapılan işlemlerin hiçbiri argüman değişkeni

Detaylı

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Uzaktan Eğitim Uygulama ve Araştırma Merkezi JAVA PROGRAMLAMA Öğr. Gör. Utku SOBUTAY İÇERİK 2 Java da Diziler Dizi Tanımlama ve İlk Değer Atama Dizi Elemanlarının Kullanılması Dizi İşlemleri Java da Diziler JAVA DA DİZİLER 4 Dizi; tek bir veri tipinde,

Detaylı

Algoritmalar ve Karmaşıklık

Algoritmalar ve Karmaşıklık Algoritmalar ve Karmaşıklık Ders 11 Algoritma Ayrık matematikte karşılaşılan bir çok problem sınıfı mevcuttur. Örneğin, verilen tamsayı grubu içindeki en büyük olanının bulunması, verilen bir kümenin bütün

Detaylı

GÜMÜŞHANE ÜNĐVERSĐTESĐ MÜHENDĐSLĐK VE DOĞA BĐLĐMLERĐ FAKÜLTESĐ ELEKTRĐK-ELEKTRONĐK MÜHENDĐSLĐĞĐ EEM 114 ALGORĐTMA TASARIMI VE PROGRAMLAMA DĐLLERĐ

GÜMÜŞHANE ÜNĐVERSĐTESĐ MÜHENDĐSLĐK VE DOĞA BĐLĐMLERĐ FAKÜLTESĐ ELEKTRĐK-ELEKTRONĐK MÜHENDĐSLĐĞĐ EEM 114 ALGORĐTMA TASARIMI VE PROGRAMLAMA DĐLLERĐ GÜMÜŞHANE ÜNĐVERSĐTESĐ MÜHENDĐSLĐK VE DOĞA BĐLĐMLERĐ FAKÜLTESĐ ELEKTRĐK-ELEKTRONĐK MÜHENDĐSLĐĞĐ EEM 114 ALGORĐTMA TASARIMI VE PROGRAMLAMA DĐLLERĐ DERS 1 PROGRAM GELĐŞTĐRME PROGRAM GELĐŞTĐRME VERĐ ĐŞLEME(DATA

Detaylı

disp VEYA fprintf KOMUTLARIYLA EKRANA MESAJ YAZDIRMA

disp VEYA fprintf KOMUTLARIYLA EKRANA MESAJ YAZDIRMA MATLAB 3.DERS disp VEYA fprintf KOMUTLARIYLA EKRANA MESAJ YAZDIRMA Daha önceki derslerimizde input komutu ile klavye üzerinden MATLAB programlama ortamına veri girmeyi öğrenmiştik. Bu dersimizde ise disp

Detaylı

Algoritmaların Karşılaştırılması. Doç. Dr. Aybars UĞUR

Algoritmaların Karşılaştırılması. Doç. Dr. Aybars UĞUR Algoritmaların Karşılaştırılması Doç. Dr. Aybars UĞUR Giriş Bir programın performansı genel olarak programın işletimi için gerekli olan bilgisayar zamanı ve belleğidir. Bir programın zaman karmaşıklığı

Detaylı

Dizi elemanları yukarıdaki gibi tek tek tanımlanabileceği gibi matematiksel ifadelerdeki diziler gibi de tanımlanabilir.

Dizi elemanları yukarıdaki gibi tek tek tanımlanabileceği gibi matematiksel ifadelerdeki diziler gibi de tanımlanabilir. DİZİLER/ARRAY: Dizi yi çeşitli şekillerde tanımlamak mümkün. Dizi içlerinde birden fazla değer saklayabilen veri kümeleridir diye tanımlarsak uygun olur sanırım. Diziler yan yana dizilmiş kutucuklar olarak

Detaylı

Algoritma ve Programlama: Karar Yapıları ve Döngüler

Algoritma ve Programlama: Karar Yapıları ve Döngüler Algoritma ve Programlama: Karar Yapıları ve Döngüler Bir algoritma, herhangi bir programlama dili (C, C++, Pascal, Visual Basic, Java gibi) ile kodlandığında program haline gelir. Algoritmada yer alan

Detaylı

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI İÇİNDEKİLER IX İÇİNDEKİLER 1 GİRİŞ 1 Kitabın Amacı 1 Algoritmanın Önemi 2 Bilgisayarın Doğuşu ve Kullanım Amaçları 3 Programlama Dili Nedir? 3 Entegre Geliştirme Ortamı (IDE) Nedir? 4 2 ALGORİTMA VE AKIŞ

Detaylı

WEB TASARIM I. Öğr. Gör. M. Mutlu YAPICI. Ankara Üniversitesi Elmadağ Meslek Yüksekokulu

WEB TASARIM I. Öğr. Gör. M. Mutlu YAPICI. Ankara Üniversitesi Elmadağ Meslek Yüksekokulu WEB TASARIM I Öğr. Gör. M. Mutlu YAPICI Ankara Üniversitesi Elmadağ Meslek Yüksekokulu Ders İzlencesi Hafta Modüller/İçerik/Konular 1. Hafta PHP Tanımı ve Sunucu Kurulumları 2. Hafta PHP Yazım Notasyonu

Detaylı

Döngüler - Loops 4/13/2011. ENF-102 Jeoloji Sayaç kontrollü bir döngüdeki temel öğeler. Sayaç (counter) Kontrollü Döngüler.

Döngüler - Loops 4/13/2011. ENF-102 Jeoloji Sayaç kontrollü bir döngüdeki temel öğeler. Sayaç (counter) Kontrollü Döngüler. Giriş Döngüler - Loops Bir ifade kümesinin tekrarlanması, yani birden fazla çalıştırılması işlemine döngü (loop) dendiği programlamaya giriş kısmında belirtilmişti. Bu derste döngülerin C programlama dilinde

Detaylı

Genel Programlama II

Genel Programlama II Genel Programlama II 22.03.2011 1 Yapılar ( Structures ) Yapılar ( structures ); tam sayı, karakter vb. veri tiplerini gruplayıp, tek bir çatı altında toplar. Bu gruplandırma içinde aynı ya da farklı veri

Detaylı

C++ Dilinde Bazı Temel Algoritmalar

C++ Dilinde Bazı Temel Algoritmalar C++ Dilinde Bazı Temel Algoritmalar Bazı eşyalar için her eve lazım derler. Az sonra bahsedeceğimiz algoritmalar da her kodcuya lazım cinsten. Sayının tek mi çift mi olduğuna karar veren programdan, çarpım

Detaylı

HSancak Nesne Tabanlı Programlama I Ders Notları

HSancak Nesne Tabanlı Programlama I Ders Notları Konsol Uygulaması Oluşturma Konsol uygulaması oluşturmak için program açıldıktan sonra Create: Project ya da New Project seçeneği tıklanabilir. New Project penceresini açmak için farklı yollar da vardır.

Detaylı

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ Java programlama dili, Java SUN bilgisayar şirketi tarafından 1991 yılında geliştiril Program bloklar halinde yazılır ve bloklar { } ile oluşturulur. Komutlar aynı satıra

Detaylı

ALGORİTMA VE PROGRAMLAMA I

ALGORİTMA VE PROGRAMLAMA I ALGORİTMA VE PROGRAMLAMA I Yrd. Doç. Dr. Deniz KILINÇ deniz.kilinc@cbu.edu.tr YZM 1101 Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi Genel Bakış 2 Diziler Dizi Nedir? Dizilerin Bildirimi

Detaylı

ALGORİTMA KAVRAMI. Bir sorunu / problemi çözmek veya belirli bir amaca ulaşmak için gerekli olan sıralı mantıksal adımların tümüne algoritma denir.

ALGORİTMA KAVRAMI. Bir sorunu / problemi çözmek veya belirli bir amaca ulaşmak için gerekli olan sıralı mantıksal adımların tümüne algoritma denir. ALGORİTMA KAVRAMI Bir sorunu / problemi çözmek veya belirli bir amaca ulaşmak için gerekli olan sıralı mantıksal adımların tümüne algoritma denir. Algoritma bir sorunun çözümü için izlenecek yolun tanımıdır.

Detaylı

Pointer Kavramı. Veri Yapıları

Pointer Kavramı. Veri Yapıları Pointer Kavramı Veri Yapıları Pointer Kavramı- Pointer Nedir? Göstericiler, işaretçiler ya da pointer adı da verilmektedir. Gösterici (pointer); içerisinde bellek adresi tutan değişkenlerdir. Şu ana kadar

Detaylı

Daha komplike uygulamalar elektronik ticaret, elektronik kimlik belgeleme, güvenli e-posta,

Daha komplike uygulamalar elektronik ticaret, elektronik kimlik belgeleme, güvenli e-posta, Çift Anahtarlı (Asimetrik Şifreleme) Bilgi Güvenliği: Elektronik iletişim, günümüzde kağıt üzerinde yazı yazarak yapılan her türlü iletişimin yerine geçmeye adaydır. Çok uzak olmayan bir gelecekte kişi/kuruluş/toplumların,

Detaylı

ÖZYİNELEME RECURSION. Yrd. Doç. Dr. Aybars UĞUR

ÖZYİNELEME RECURSION. Yrd. Doç. Dr. Aybars UĞUR ÖZYİNELEME RECURSION Yrd. Doç. Dr. Aybars UĞUR Giriş Kendini doğrudan veya dolaylı olarak çağıran fonksiyonlara özyineli (recursive) fonksiyonlar adı verilir. Özyineleme (recursion), iterasyonun (döngüler,

Detaylı

Algoritmalar. Heap Sort. Bahar 2017 Doç. Dr. Suat Özdemir 1

Algoritmalar. Heap Sort. Bahar 2017 Doç. Dr. Suat Özdemir 1 Algoritmalar Heap Sort Bahar 2017 Doç. Dr. Suat Özdemir 1 Heap Sort Heap Sort algoritması Merge Sort ve Insertion Sort algoritmalarının iyi özelliklerini bir arada toplar. Algoritma Insertion Sort gibi

Detaylı

TEMEL BİLGİSAYAR BİLİMLERİ. Programcılık, problem çözme ve algoritma oluşturma

TEMEL BİLGİSAYAR BİLİMLERİ. Programcılık, problem çözme ve algoritma oluşturma TEMEL BİLGİSAYAR BİLİMLERİ Programcılık, problem çözme ve algoritma oluşturma Programcılık, program çözme ve algoritma Program: Bilgisayara bir işlemi yaptırmak için yazılan komutlar dizisinin bütünü veya

Detaylı

BMT 101 Algoritma ve Programlama I 11. Hafta. Yük. Müh. Köksal Gündoğdu 1

BMT 101 Algoritma ve Programlama I 11. Hafta. Yük. Müh. Köksal Gündoğdu 1 BMT 101 Algoritma ve Programlama I 11. Hafta Yük. Müh. Köksal Gündoğdu 1 C++ Fonksiyonlar Yük. Müh. Köksal Gündoğdu 2 C++ Hazır Fonksiyonlar Yük. Müh. Köksal Gündoğdu 3 C++ Hazır Fonksiyonlar 1. Matematiksel

Detaylı

Özyineleme (Recursion)

Özyineleme (Recursion) C PROGRAMLAMA Özyineleme (Recursion) Bir fonksiyonun kendisini çağırarak çözüme gitmesine özyineleme (recursion), böyle çalışan fonksiyonlara da özyinelemeli (recursive) fonksiyonlar denilir. Özyineleme,

Detaylı

BLGM BÖLÜM. Problem Çözme Kavramları (Algoritma ve Akış Şemaları)

BLGM BÖLÜM. Problem Çözme Kavramları (Algoritma ve Akış Şemaları) BLGM108 1. BÖLÜM Problem Çözme Kavramları (Algoritma ve Akış Şemaları) 1 Yazılım Geliştirme Adımları 1. Gereksinimlerin belirlenmesi Problemin ne olduğunu anlama: sorunu çözmek için ne gereklidir, çözüm

Detaylı

DİZİLER. Bu ünitede yapılan örnekler Visual Studio 2010 programındaki Visual Basic programlama diliyle çözülmüştür.

DİZİLER. Bu ünitede yapılan örnekler Visual Studio 2010 programındaki Visual Basic programlama diliyle çözülmüştür. DİZİLR GİRİŞ Bu ünitede, akış diyagramlarının yardımıyla birçok veriyi tek bir alanda nasıl saklayabileceğimiz, işleyebileceğimiz ve çağırabileceğimiz konusundaki bilgiler anlatılacaktır. Teknolojinin

Detaylı

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2 NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2 JAVA DA PROGRAM DENETİMİ VE OPERATÖRLER Java programlama dilinde temel tipleri ve nesneleri yönlendirmek ve değiştirmek için operatörler kullanılır. Atamalar sağ taraftaki

Detaylı

YZM 2116 Veri Yapıları

YZM 2116 Veri Yapıları YZM 2116 Veri Yapıları Yrd. Doç. Dr. Deniz KILINÇ Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi Yazılım Mühendisliği Bu bölümde, BÖLÜM - 8 Problem Tanımı Arama Ağaçları İkili Arama

Detaylı

YZM 2116 Veri Yapıları

YZM 2116 Veri Yapıları YZM 2116 Veri Yapıları Yrd. Doç. Dr. Deniz KILINÇ Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi Yazılım Mühendisliği BAŞLAMADAN ÖNCE Bu dersi alan öğrencilerin aşağıdaki konuları bildiği

Detaylı

Length: metin uzunluğunu yada diğer bir deyişle dizi elaman sayısını döndürür.

Length: metin uzunluğunu yada diğer bir deyişle dizi elaman sayısını döndürür. Programlama Temelleri Trim: metnin başındaki ve sonundaki boşlukları kaldırır. Trim( Selam ) Selam şeklinde çıkar Split: metin içinde ayırma işlemi yapar. Split( ) Metni boşluklarını diziye atar. oşluk

Detaylı

MATLAB de. Programlama. Kontrol Yapıları. Döngü Yapıları. Doç. Dr. İrfan KAYMAZ Matlab Ders Notları

MATLAB de. Programlama. Kontrol Yapıları. Döngü Yapıları. Doç. Dr. İrfan KAYMAZ Matlab Ders Notları MATLAB de Programlama Kontrol Yapıları Döngü Yapıları Doç. Dr. İrfan KAYMAZ if Şartlı deyimi: Bir mantıksal ifadeyi kontrol ederek bunun sonucuna göre mümkün seçeneklerden birini icra edebilen bir komuttur.

Detaylı