IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası
  sohbet

 Kayıt ol  Topluluk
Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 25 Şubat 2012, 19:57   #1
Çevrimdışı
aSi
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Ö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!
int faktoriyel(int say) // { if(say==1 || say==0) //1. kısım return 1; // return say*faktoriyel(say-1);//2. kısım } main() { int n; scanf("%d",&n); printf("%d", faktoriyel(n)); getch(); }


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!
int yaz(int say) { //1. kısım if(say>1) yaz(say-1); printf("%d\n",say); return 0; }

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!
#include<stdio.h> #include<conio.h> int gun; void faizHesapla(float borcpara,int gecengun) { printf("%d.gun %3.3f \n",gun-gecengun,borcpara); if (gecengun == 0) //rekürsif yapıdan çıkış koşulu return; else faizHesapla(borcpara+borcpara*2/100,gecengun-1); //günlerin azaltılması ve borç miktarının değişmesi ile yeniden fonksiyonun çağırımı } main() { float borc; printf("borc miktari giriniz "); scanf("%f",&borc); printf("gün sayısını giriniz "); scanf("%d",&gun); printf("toplam borcunuz un günlere göre dağılımı \n"); faizHesapla(borc,gun); getch(); }



__________________
Doğruları biliyorsan, yalanları dinlemek eğlencelidir.
 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları reklam ver Benimmekan Mobil Sohbet
Cevapla

Etiketler
fonksiyonlar, rekürsif, özyinelemeli


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Kapalı
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
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