14 Aralık 2013 Cumartesi

44 C# Görsel Programlama 44 Recursive (Öz Yinelemeli) Metodlar

Merhaba arkadaşlar. Bugün, yazdıkları programlarda hız tutkunu olanların çok işine yarayacak bir konuyu anlatmaya çalışacağım. Recursive (Öz Yinelemeli) metodları halledeceğiz inşallah bu yazımda. 

Program yazmak bir meziyet ama artık gelişen internet ortamı bilgiye kolay ulaşma öğrenme yöntemlerinin artması herkesin kod yazabilir duruma gelmesini sağlamış durumda. Pek çok kişinin kod yazıp yazılım geliştirebildiği ortamda bu çoğunluğun arasından sıyrılmak önemli. Bunu da ancak daha güvenli daha hızlı ve sayabileceğimiz daha daha şeklindeki özellikleri sağlayarak yapabiliriz. İşte bu yazımda farkımızı ortaya çıkaracak bir özelliğimiz olan hız için işimize yarıyacak muhteşem bir konuyu öğrenmek üzereyiz.

Detaylara girmeden sadece ne demek istediğimi kısaca bir göstereyim aklımızda soru işareti kalmasın.

Birazdan bir faktöriyel hesaplama programı yazacağız bunu bir bildiğimiz normal yöntemle bir de recursive yöntemi ile yapacağız. 

Hep beraber o muhteşem zaman farkına bakalım isterseniz.


Bakarsak recursive ile yapılan işlem normal kodlardan 6 kat daha hızlı işlem yaptı.

Demek ki sürekli tekrar ediyorum ama bir hız canavarını öğreneceğiz.


O zaman bismillah deyip işe koyulalım.

Öncelikle bu kadar gösteriden sonra hatta daha konuyu açar açmaz aklımıza gelen ilk soru nedir bu recursive metodlar? bu sorunun cevabı ile işe başlayalım.

Daha önceki konularımızda hatırlarsınız metodları işlemiştik. Ana programın sınıfı içinde metodumuzu yazar bu metoda ihtiyacımız olduğu zamanda metodumuzu çağırırdık iş biterdi. 

Bu tanımdan anlaşılacağı gibi bir metod içinde başka bir metodun çalışması gerekse o metodu da çağırabiliriz demektir. İşte kullanılan metod içinde tekrar aynı metodu çağırarak yazdığımız metodlara biz recursive, adındanda anlaşılacağı gibi öz yinelemeli metodlar diyoruz. Belli şartlar sağlanana kadar metod sürekli kendini çağırıp işlemini yapar.

Recursive metodlar her yerde kullanabileceğimiz gibi Windowsta en bilindik kullanıldığı yer dosya açma işlemi esnasındadır. Bu metod sayesinde defalarca klasör içinde klasör açabiliriz ve bu işlem çok hızlı olur.

Şimdi formdan da gördüğümüz gibi faktöriyel hesabı yapan bir programı recursive ile yazmaya çalışalım.

Recursive yazmanın normal metod yazmaktan hiç bir farkı yoktur. Daha önce bu konuyu anlattığım için metod yazma mantığı ve şekli üzerinde durmayacağım.


Şimdi kodlarımızı kısaca inceleyelim ne imiş bu recursive in alameti fahrikası görelim.

Metodumuz long türünde bir değer geri döndürecek ve long türünde de bir n parametresi bekliyor bunu ilk satıra baktığımızda anlayabiliyoruz.

En başta sonuç değişkenimize zaten 1 değerini atamıştık. Eğer gelen n değeri sıfır veya 1 ise direk sonuç değişkenin değerini döndür dedik. Sonuçla ilgili bir işlem yapılmadığı içinde 1 değerini geri döndürecektir.

Eğer gelen n değeri 0 veya 1 den farklı ise işte şimdi işlem yapılma zamanı.

n değerine mesela 3 değerinin geldiğini düşünelim.

sonuç*=n; 


bu ifade sonucun gelen n değeri ile çarpılıp sonucun yine sonuç değişkenine atanmasını sağlayacaktır.

sonuc un ilk değeri 1 idi n 3 çarpımlarında gelen sonuç 3 oldu.

ve bir adım altında n değerini 1 azalttık. 

Şu anda n değeri 2.

Ve biz yine faktöriyel metodunu çağırdık. n değeri 2 idi ve yukarıdan yine başladı if şartı sağlanmadığı için geçti tekrar else ifadesi içinde 3 ile 2 çarpıldı ve 6 değeri sonuç değerine atandı. n değeri ise 1 oldu.

Tekrar metod kendini çağırdı ve n değeri 1 olduğu içinde if sağlandı ve sonuç değeri 6 olarak geri döndürüldü ve işleyen metod sona erdi.

İşte yazdığımız metodun çalışma mantığı böyleydi.

Burada bilmemiz gereken bir diğer şey ise geri değer döndüreceğini belirttiğimiz metod kendi ana metodu içinde şartlardan döngülerden bağımsız return ifadesi ile bitmelidir.

 Eğer bunun olması programın sonucunda çıkması gereken çıktıya etki ediyor ise o zaman her şart veya her döngü içinde return ifadesi kullanılması gerekir.

Yukarıdaki kodlara baktığımızda en altta yazılan return ifadesi hiç bir zaman işleme girmemesine rağmen programın hata vermemesi için yazılması gerekmektedir. Onu şu şekilde yaparız genelde, kodlarımızı yazarken aşağıdaki gördüğümüz şekliyle kullanalım ki ekstradan kod kalabalığından da kurtulmuş olalım.


Birde recursive olmayan normal metodun kodlarını görelim.



Ya normal yazdığımız metodun kodları daha kısa aslında diye düşünebiliriz ama görüldüğü gibi recursive 6 kat daha hızlı.

Böylelikle bu dersinde sonuna gelmiş olalım. Umarım yararlı bir yazı olmuştur. Siz çalışan arkadaşlarıma kolaylıklar dilerim. Vesselam.

Murat Bilginer













Hiç yorum yok:

Yorum Gönder