Home / Veri Yapıları / Recursive Fonksiyon (Özyinelemeli Fonksiyonlar) Nedir?

Recursive Fonksiyon (Özyinelemeli Fonksiyonlar) Nedir?

Türkçesi özyinelemeli demek olan Recursive fonksiyonlar esasen fonksiyonun çalışma biçimini bize anlatan ifadedir. Bildiğiniz üzere fonksiyonlar ikiye ayrılır, birincisi geri dönüş tipi olmayan void türündeki fonksiyonlar, ikincisi ise return tipi olan fonksiyonlardır.

Recursive fonksiyonlar kendi kendisini çağırırlar, bu çağırma işlemi belirli bir amaç doğrultusunda yapılır ve belirli bir durum sağlanınca return edilir. Recursive fonksiyonlar yapısal olarak Loop’lara yani döngülere benzetilebilir, ancak kesinlikle ve kesinlikle karıştırılmamalıdır, birbirinin yerine konulmamalıdır. Yalnızca, kendi kendisini çağırması durumunu benzetmek amacıyla düşünebilirsiniz. Ve her loop’ta olduğu gibi bir çıkış noktası konulması gerekmektedir. Buna kimisi temel durum, kimisi simple case der. İşin terminolojik kısmı bir yana, sürekli kendi kendisini çağıran bir fonksiyon büyük ihtimalle işimize yaramayacaktır, amacımız doğrulsunda bir kritik noktası bulunmalıdır ki kullanıcıya bir şeyler return edebilsin.

Tabii return edebilsin derken, hiçbir şey return etmeyebilir de, Recursive fonksiyonlar void türündeki fonksiyonlarda da kullanılmaktadır. Ancak yaygın kullanımı return edilebilen yani kullanıcıya değer döndüren fonksiyonlar üzerindedir. Şimdi örnek kısmına girelim.

Recursive Fonksiyon Faktöriyel Örneği

Recursive fonksiyonları en iyi şekilde anlayabileceğimiz örneklerin başında faktöriyel hesabı gelmektedir. bildiğiniz üzere n! (nfaktöriyel) ifadesinin matematiksel açılımı n*(n-1)*(n-2)*….*1 şeklindedir. Yani 5! = 5*4*3*2*1 olur. (Faktöriyelin özelliklerini hatırlıyorsanız, 5! ifadesinin 5*4! olduğuna anımsarsınız, bu işimize yarayacak!)

Şimdi inceden kod kısmına girelim.

int faktoriyel(int n)
{
   
}

Yukarıda int türünden bir fonksiyon oluşturduk. Parametre olarak da int türünden bir parametre aldı. Niyetimiz bu fonksiyonu recursive olarak faktöriyel hesaplayabilir bir hale getirmek.

Size az önce recursive fonksiyonların temel durumu kontrol etmesi gerektiğinden bahsetmiştim. Temel durum yani simple case, yaptığımız programa göre değişir, eğer söz konusu faktöriyel hesabı ise 0 sayısını kontrol etmemiz gerekir. Çünkü 0 ile kaçı çarparsanız çarpın, sonuç sıfıra dönüşür. Zaten faktöriyel hesabında, 0! ifadesi de 1’dir. Bu yüzden bu durumu kontrol etmemiz gerekmektedir.


int faktoriyel(int n)
{
    //simple case
    if(n = 0)
        return 1;
}

 

Yukarıdaki if’li ifadede n sayısı 0 olduğu durumda kullanıcıya 1 sayısını return ettik. Peki ya değilse biz faktöriyeli nasıl hesaplayacağız? Daha da önemlisi, kendi kendini çağırarak bu fonksiyon bunu nasıl halledecek. Hemen Aşağıya bakalım.


int faktoriyel(int n)
{
    //simple case
    if(n == 0)
        return 1;
    else
        return n * faktoriyel(n - 1);

}

fonksiyonun en önemli satırına geldik. return n * faktoriyel(n-1); ifadesi buradaki recursive kısmı oluşturmaktadır. Daha doğrusu faktoriyel(n-1) ifadesi recursive kısımdır. yani bu satırda program kullanıcıya bir integer değer return etmeye kalkıyor, n * diyor, daha sonra bir bakıyor, kendi fonksiyonunu tekrar çağırmış, bu sefer program en başa gidiyor, ancak n sayısının 1 azaltıldığına dikkat edin. Peki ne oluyor?

Çalışma Adımları

Şimdi dilerseniz 5! (beş faktöriyel) ifadesinin hesaplanmaya çalışıldığını varsayalım. Yani biz faktoriyel(5) ifadesini çalıştırmışız gibi düşünün. Peki neler oluyor bu durumda?

  1. Adım: n = 5 için ==> return 5 * faktoriyel(4);
  2. Adım: n = 4 için ==> return 4 * faktoriyel(3);
  3. Adım: n = 3 için ==> return 3 * faktoriyel(2);
  4. Adım: n = 2 için ==> return 2 * faktoriyel(1);
  5. Adım: n = 1 için ==> return 1 * faktoriyel(0);
  6. Adım: Buraya Dikkat! ==> return 1

Ne oldu şimdi? Eğer matematikte bileşke fonksiyon problemi çözdüyseniz bunun ne olduğunu bilirsiniz. Biz bu özyineleme durumunda temel durum kontrolünü yapmıştık. Ve n sayısı 0 olduğu anda bize gerçek bir sayı (bir) return edildi. Yani faktoriyel(0) fonksiyonunun 1 olduğunu öğrendik. Eee ne oldu? İsterseniz yerine koyun, tüm kod çorap söküğü gibi gelsin 🙂

5. Adımda ==> faktoriyel(0) 1 olduğu için faktoriyel(n=1) için 1 gelir.

4. Adımda ==> faktoriyel(1) 1 olduğu için faktoriyel(2) için 2 gelir.

3. Adımda ==> faktoriyel(2) 2 olduğu için Faktoriyel(3) için 6 gelir.

2. Adımda ==> faktoriyel(3) 6 olduğu için faktoriyel(4) için 24 gelir

1. Adımda ==> faktoriyel(4) 24 olduğu için faktoriyel(5) için 120 gelir.

 

Recursive Fonksiyon Hazır Kod


#include <stdio.h>

int faktoriyel(int n)
{
    //simple case
    if(n == 0)
        return 1;
    else
        return n * faktoriyel(n - 1);

}

int main()
{
    int girilen;
    printf("bir sayi girin ... ");
    scanf("%d", &girilen);
    int faktoriyelSonuc = faktoriyel(girilen);
    printf("%d", faktoriyelSonuc);

}


One comment

  1. çok teşekkürler on numara video on mumara makale..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir