Yinelemeli fonksiyonlar adından da anlaşılacağı üzere kendini dolaylı ve doğrudan yollarla çağıran fonksiyonlardır. Dolaylı olanlar başka bir metodtan çağrılması şeklinde gösterilebilir.
Dolaylıya Örnek:
1 2 3 4 5 6 7 8 |
void A() { B(); } void B() { A(); } |
şeklinde verilebilir.
Yinelemeli fonksiyonlarda esas amaç problemi çözülebilir bir hâle indirgemektir bunun için belirli koşul sağlandığında çözüm yapılmalıdır aksi taktirde sonsuz döngüye girme olasılığı yinelemeli fonksiyonlarda oldukça yüksektir.
Bir problemin çözümünnde yinelemeli fonksiyon kullanılması kodu daha anlaşılır yapar fakat bellek kullanımını artırmaktadır. Ayrıca yinelemeli(recursive) olarak çözülen her problem döngü(iteration) yöntemiyle de çözülebilir.
Yinelemeli Fonksiyon yöntemiyle çözülmesi istenen bir kaç problem verirsek :
1- Bir sayının faktöriyelini bulma.
2- Fibonacci dizisindeki n. sayının bulunması.
3- Bir taban ve üs girdileriyle üs alma işlemi.
4- Hanoi kuleleri problemi çözümü.
gibi bir çok problemde kullanılabilir.
Çözümler
1-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
int faktoriyel(int n) { // Faktöriyel mantığına göre 5! = 5 * 4! olduğunu biliyoruz // 1! = 1 bilgisini de kullanarak bu şekilde yapabiliriz. if(n==1) return 1; return n * faktoriyel(n-1); } int main() { int n; printf("Faktoriyeli alinacak sayiyi giriniz\n"); scanf("%d",&n); printf("Cevap : %d",faktoriyel(n)); return 0; } |
2-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int fibonacci(int n) { //Fibonacci Dizisi : 0 1 1 2 3 5 şeklinde devam ettiğine göre //Fibonacci mantığına göre ise örneğin 3. eleman için 2. elemanla 1. elamanın toplamıdır. //n=0 için 0 ve n=1 için 1 döndermesi gerektiğinden bu yapı kullanılabilir. if(n==0 || n==1) return n; return fibonacci(n-1) + fibonacci(n-2); } int main() { int n; printf("Fibonacci dizisinde hangi siradaki(sira 0 ile başlar ) elemani bulmak istediginizi giriniz\n"); scanf("%d",&n); printf("Cevap : %d",fibonacci(n)); return 0; } |
3-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
int usAl(int taban,int us) { //3^4 = 3 * 3^3 bilgisi ve 3^0 = 1 bilgisinden faydanalarak //Benzer şekilde yapılabilir if(us==0) return 1; return taban * usAl(taban,us-1); } int main() { int taban,us; printf("Ussu alinacak sayiyi ve us degerini giriniz\n"); scanf("%d %d",&taban,&us); printf("Cevap : %d",usAl(taban,us)); return 0; } |
4-
Hanoi Kuleleri Problemi : Bu problemde 3 adet çubuk ve n adet disk bulunur bunlara A,B,C dersek A-> Disklerin bulunduğu çubuk B-> Diskleri taşırken kullanılan çubuk C-> Disklerin taşınacağı çubuk En kısa yoldan A ‘ dan C ‘ e diskleri hiç bir zaman kendinden daha küçüğünün üstünde kalmayacak şekilde (her taşımada sadece en üsttekidisk taşınacak) nasıl taşınır?
Çözümde kullanılacaklar : Taşınacak Disk Sayısı , Disklerin İlk Çubuğu, Aracı Çubuk , Taşınacak Çubuk
1 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
void hanoiCoz(int diskSayisi,char A,char B,char C) { if(diskSayisi==1) { //Son disk taşıma işlemi printf("%c -> %c \n",A,C); } else { // n-1 diski B'e (Aracı çubuk) taşıyoruz. hanoiCoz(diskSayisi-1,A,C,B); // A'da (Disklerin İlk çubuğu) kalan son diski C'e(Taşınacak çubuk) taşıyoruz. hanoiCoz(1,A,B,C); // B'de kalan diskleri de C e taşıyoruz. hanoiCoz(diskSayisi-1,B,A,C); } } int main() { int n; printf("Disk sayisini giriniz\n"); scanf("%d",&n); hanoiCoz(n,'A','B','C'); return 0; } |