25 Şubat 2012, 19:57 | #1 | |
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0) | Özyinelemeli (Rekürsif) fonksiyonlar Bir fonksiyonun kendini yeniden çağrması diye tanımlayabiliriz, her ne kadar gereksiz gibi gözüksede birçok algoritmanın çözümünü kolaylaştırmak için vazgeçilmez bir yöntemdir. Çünkü karmaşık algoritmalara, bu yöntemi kullanarak çok iyi çözümler üretebiliriz. Yeni başlayanlar için yazılan bu yazıda rekürsif fonksiyonlara örnek vererek açıklamaya çalışılmıştır. Şimdi bu konuyla alakalı en çok rastlayacağınız, konuyu kavrama açısından güzel bir örnekle başlayalım. n sayısının faktöriyelini alan rekürsif fonksiyonu yazalım.. adım 1. öncelikle faktöriyelin tanımına bakalım n!=1*2….(n-1)*n n!=(n-1)!*n şimdi bu tanıma bakarak kodu yazalım. Kod: Kodu kopyalamak için üzerine çift tıklayın!
1. kısımda fonksiyonun sonlanma koşulu yer almakta ikinci kısımda ise faktöriyelin tanımından yararlanarak faktoriyel fonksiyonunu yeniden cağırma işlemi yapılıyor . şimdi bir örnekle kodu açıklayalım n=4 olsun sonuc= faktoriyel(4) =4*faktoriyel(3) =4* 3*faktoriyel(2) =4* 3* 2*faktoriyel(1) =4* 3* 2* 1 öncelikle fonksiyona 4 değeri gönderiliyor say değeri 1 veya 0 a eşit olmadığı için return 4*faktoriyel(3) satırı işlenir. Bu satrda faktoriyel fonksiyonu yeniden cağrılmış olur faktoriyel(3) hesaplanır yanındaki “4*” ifadesi ise daha sonra kullanılması için belleğin yığın adını verdiğimiz alana atılır..ve bu durum say değeri 1 oluncaya kadar devam eder ve son olarak faktoriyel(1) hesaplanır, sonuçlar çarpılarak fonksiyon sonucu belirlenir. rekürsif fonksiyonlarda temel olarak fonksiyonun sonsuz sayıda çağrılmasnı önlemek için bir koşul ifadesi(1. kısım) ve fonksiyonun yeniden çağrıldığı kod demeti (2.kısım) olması gerekir. Bir rekürsif fonksiyon yazarken bu kısımlara dikkat ederek yazacağız .. Rekürsif fonksiyonlarda dikkat etmemiz gereken bir diğer kısım ise yığın mantığıdır şimdi yine basit bir programla bu konuyu ele alalım. Kod: Kodu kopyalamak için üzerine çift tıklayın!
bu durumda printf kısmı işlenmeden fonksiyon yeniden çağrılmıştır “yaz(say-1)”. Fonksiyonlar yeniden çağrıldığı için printf kısmı işlenmeyecek, bu kısım önce yığına atılacak daha sonra fonksiyon sayıyı return etmeye başladıktan sonra yığından tekrar geri çekilebilecekti. örnek olarak bu fonksiyona mainden 4 değerini göndermiş olalım; Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. şekilde çember içine aldığım kodlar fonksiyon ilk çağrıldığında işlenen kodlardır .Çember dışında kalan kodlar önce işlenmez,veriler yığına atılır yığına son eleman atıldıktan sonra atılan veriler tekrar geri çekilir. Yığındaki prensip “son giren eleman ilk çıkar” olduğu için ekrana önce 1 son olarak 4 yazar. Şekildeki Ok işaretlerini takip ederek yığın prensibini anlayabilirsiniz. Şekil biraz bozuk olabilir arkadaşlar artık kusuruma bakmazsızız paintle çizdim en fazla bu oluyor Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. umarım anlaşılmıştır. Bu örnek hakkında son olarak birşey daha ekleyeceğim printf fonksiyonu eğer 1. kısım da olsaydı önce say değişkenini ekrana yazdırıp daha sonra yeni fonksiyonu çağıracaktı böylelikle ekran çıktısı 4 3 2 1 şeklinde olacaktı . Örneklerdende anlaşılacağı gibi rekürsif fonksiyonların yaptığı işlemleri döngülerle de yapılabilir, ancak bazı durumlarda rekürsif yaklaşım sonuca daha iyi ulaşmanızı sağlar. Bazı dizin tarama, kelime bölme, veri ağaçları, sıralama gibi işlemlerde elverişlidir, algoritma kurabilme yeteneğinizi geliştirir, fakat bazende yığının çok uzaması ve bununla birlikte belleğin gereksiz yere kullanımı iyi sonuçlar vermeyebilir.Son olarak bir soru yazıp konuyu bitiriyorum ,arkadaşlar yazı umarım faydalı olmuştur hepinize iyi çalışmalar .. Soru : Bir banka kredi kartı borcunu geç yatıran müşterilerine geçen her gün için toplam broç miktarını %2 arttırıyor. a.) gün ve borç miktarları dışarıdan girilip toplam borç hesaplayan program yazınız .. b.) a şıkkını bir özyinemeli fonksiyon kullanarak yapınız .. c.) sizce bir bilgisayar kredi kartı ile alınmalı mı Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. Cevaplar : b (a ve c şıkkını size bırakıyorum ) Kod: Kodu kopyalamak için üzerine çift tıklayın!
__________________ Doğruları biliyorsan, yalanları dinlemek eğlencelidir. | |
|
Etiketler |
fonksiyonlar, rekürsif, özyinelemeli |
Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir) | |
| |
Benzer Konular | ||||
Konu | Konuyu Başlatan | Forum | Cevaplar | Son Mesaj |
İkili Ağacı Listeleme (Rekürsif fonksiyon ile) | aSi | C ve C++ | 0 | 25 Şubat 2012 19:59 |
Aynı işleve sahip yinelemeli ve özyinelemeli iki fonksiyon arasındaki performans fark | aSi | C ve C++ | 0 | 22 Şubat 2012 14:58 |
C# Fonksiyonlar | Sunay | C# | 0 | 24 Nisan 2010 01:54 |