Programlamada Recursive Fonksiyon Mantığı

C Programlama Dilinde sürekli olarak fonksiyonlar kullanarak yazdığımız programları basite indirgemeye çalışıyoruz ve program daha anlaşılır bir hal alıyor. Burada kullandığımız fonksiyonların ismi aslında Iterative Fonksiyonlar dır. Yani Iterativ fonksiyonlar, kendilerine söylenen işlemi yapar ve geriye bir değer döndürür ya da döndürmez.

Bu yazıda ise Iterative olmayan ve kendi içinde kendini çağırabilen Recursive Fonksiyonlar ile ilgili örnekler paylaşacağım. Bu fonksiyonların genel yapısı aşağıdaki gibidir.

rec_fonk(deger) {
   if(deger==0) return 1;
   else return rec_fonk(deger-1);
}

Bu yapıda Recursive Fonksiyon bir değer alır ve bir değer döndürür. Aslında Recursive Fonksiyonların bir döngü gibi çalıştığını anlamak pek de zor olmasa gerek.

Burada dikkat edilmesi gereken bir nokta vardır. Eğer fonksiyonun, sonsuz kere kendi içinde dönmesini istemiyorsanız bir şart koymanız gerekiyor. Bunu da if komutu ile yukarıda sağladık.

Recursive Fonksiyonlar ile yapılmış birkaç programa bakarsanız daha iyi anlayabilirsiniz.

Recursive Fonksiyonlar ile Faktöriyel Hesabı Yapan Program

/* cemdemir.net */
#include <stdio.h>
#include <stdlib.h>
faktoriyel(sayi){
   if(sayi==0) return 1;
   else return sayi*faktoriyel(sayi-1);
}
main() {
   int sayi,deger;
   printf("Bir Sayi Giriniz ---> "); scanf("%d",&sayi);
   deger=faktoriyel(sayi);
   printf("%d",deger);
   getch();
}

Girilen Sayı Değerine Kadar Olan Sayıları Gösteren Program

/* cemdemir.net */
#include <stdio.h>
#include <stdlib.h>
tumsayilar(sayi) {
   if(sayi==0) return 1;
   else { 
   printf("\n%d",sayi); 
   return tumsayilar(sayi-1); 
   }
}
main() {
   int sayi;
   printf("Bir Sayi Giriniz ---> "); scanf("%d",&sayi);
   tumsayilar(sayi);
   getch();
}

Girilen Sayı Değerine Kadar Olan Sayıları Toplayan Program

/* cemdemir.net */
#include <stdio.h>
#include <stdlib.h>
toplam(sayi) {
   if(sayi==0) return 1;
   else return sayi+toplam(sayi-1);
}
main() {
   int sayi,deger;
   printf("Bir Sayi Giriniz ---> "); scanf("%d",&sayi);
   deger=toplam(sayi)-1;
   printf("Girilen Sayi Degerine Kadar Olan Toplam ---> %d",deger);
   getch();
}

Recursive Fonksiyonlar ile Çarpım Tablosunu Gösteren Program

/* cemdemir.net */
#include <stdio.h>
#include <stdlib.h>
tablo(x) {
   int i;
   if(x<10) {
      for(i=1;i<11;i++) printf("%-3d",x*i);
      printf("\n");
      return tablo(x+1);
   }
   else return 1;
}
int main() {
   int x=1;
   tablo(x);
   getch();
}

Recursive Fonksiyonlar ile Asal Sayıları Bulan Program

/* cemdemir.net */
#include <stdio.h>
#include <stdlib.h>
asal_bul(sayi) {
   int i,asal;
   if (sayi==0 || sayi==1) return 1;
   else {
      for(i=2;i<(sayi/2)+1;i++) {
         if(sayi%i==0) asal=0;
      }
      if(asal!=0) printf("\n%d",sayi);
      return asal_bul(sayi-1);
   }
}
main() {
   int sayi;
   printf("Kaca Kadar Olan Asal Sayilar Gosterilsin ---> "); scanf("%d",&sayi);
   asal_bul(sayi);
   getch();
}

Ek olarak, her Iteratif Fonksiyonu Recursive Fonksiyona, her Recursive Fonksiyonu da Iterative Fonksiyona çevirmek teknik olarak mümkündür.

Son olarak internette yaptığım araştırma sonucu Recursive Fonksiyonların, Iterative Fonksiyonlara göre çok daha yavaş çalıştığını ve daha fazla bellek kullandığını öğrendim. Bu sebeple mecbur kalınmadıkça Recursive fonksiyonlar kullanılmamalıdır.

Benzer Yazılar

Yorumlar

  • Turgay Özgür , 04 Ocak 2011 - 23:40:33

    Eline sağlık Cem.Bazı şeyleri daha iyi anlamamı sağladın.Yalnız bir sorum olacak.Recursive fonksiyon tanımlarken geri döndüreceği değerin tipini tanımlamamız gerekmiyor mu? Yani int recurFonk(int); gibi.

    Cevapla
    • Cem Demir , 05 Ocak 2011 - 07:16:39

      Tabii ki, Iterative fonksiyonlarda olduğu gibi burada da tanımlamak gerekiyor. Eğer tanımlanmazsa, senin de bildiğin üzere int olarak tanımlanmış sayılıyor.

      Cevapla
  • aaa , 10 Ocak 2011 - 18:21:54

    return 1 yerine return 0 yazarsan sanırım degerden 1 cıkarmaya gerek kalmıcak.

    Cevapla
  • aaa , 10 Ocak 2011 - 18:42:57

    ayrıca flag kullanırken ilk degeri vermezsen cogunlukla yanlıs calısabilior.. mesela gördügüm kadarıyla asal bulan program yanlıs calısıo sanırım.

    Cevapla
    • Cem Demir , 12 Ocak 2011 - 10:24:12

      Asal bulan program doğru çalışıyor da, sanırım derleyici farklılığından doğmuş bir sıkıntı olabilir. Fakat dediğin gibi asal değişkenine en başta 1 değerini atamak (asal=1) en sağlıklı yöntem. Uyarı için teşekkürler.

      Cevapla
  • yagmur , 12 Ocak 2011 - 23:30:22

    tesekkurler..

    Cevapla
  • kaja , 18 Mayıs 2011 - 13:16:03

    recursive foksiyonlar stack'ı doldurur belleği değil!!!!!!!

    Cevapla
  • Hayri Top , 31 Mayıs 2011 - 05:52:31

    Admin bana 'Kullanıcıdan adlığı iki sayının çarpımını kendi kendini çağıran fonksiyon kullanarak fakat çarpma işlemi kullanmadan yazan program .

    Cevapla
    • omer , 10 Aralık 2012 - 16:23:27

      #include
      #include
      int carp(int sayi1, int sayi2){
      if(sayi2==0||sayi2==1)
      return 0;
      else
      return sayi1+carp(sayi1,sayi2-1);
      }
      int main(){
      int sayi11,sayi22;
      int sonuc;
      printf(“sayilari gir”);
      scanf(“%d”,&sayi11);
      scanf(“%d”,&sayi22);
      sonuc=carp(sayi11,sayi22);
      printf(“%d*%d=%d”,sayi11,sayi22,sonuc);
      }
      az gec olmus ama yeni gördüm :)

      Cevapla
  • Pingback: PHP : Fonksiyonlar » Cem Demir

  • emre , 26 Aralık 2013 - 19:43:30

    recursive fonk. ile fibonacci yapan programı yazarmısınız ?

    Cevapla
  • Furkan kaan IŞIK , 22 Ocak 2014 - 01:35:15

    Yanlız asal sayi bulan programda 5 girdiğinde 5,3,2 sıralarken 6 girdiğinde sadece 3 ve 2 yazıyor donguyle alakalı bır sıkıntı var galiba

    Cevapla
  • Sultan Öztürk , 14 Mayıs 2014 - 02:36:25

    Kodda genel anlamı ile doğru fakat 11 girildiğinde 11 5 3 2 yazıyor 7 yi yazmıyor.
    asal_bul(sayi) {
    int i,asal;// burda asal=1 dersek 7 yide alıyor.
    if (sayi==0 || sayi==1) return 1;
    else {
    for(i=2;i<(sayi/2)+1;i++) {// ve bu kısımda(sayi/2)+1 bunu yazmak gereksiz olmuş bence i<sayi demek de yeterli oluyor.
    if(sayi%i==0) asal=0;
    }
    if(asal!=0) printf("\n%d",sayi);
    return asal_bul(sayi-1);
    }
    }
    iyi çalışmalar :)

    Cevapla
  • Sultan Öztürk , 14 Mayıs 2014 - 02:43:21

    Ve bu arada aklıma takıldı da sizce asal sayı örneği tam olarak özyinelemeli fonksiyonu tanımlıyor mu?

    Cevapla
  • ömer , 17 Haziran 2014 - 14:10:41

    bir c++ programında double veri tipi içeren 1 boyutta 7 iki boyutta 8 üc boyutta 24 dördüncü boyutta 64 veri saklayabilen bir dizi değişkeni nasıl yapılır

    Cevapla
  • çağrı tepebaşılı , 19 Kasım 2014 - 19:27:09

    Son cümlelerinde koyu olarak yazdığın şey her zaman geçerli olan birşey değil bunun en güzel örneği quicksorttur, bazı durumlarda iterative sadece recursion’u taklit eder bu durumlarda rekürsif daha hızlı dahi çalışabilir.

    Fakat genel olarak iteratif fonksiyonların daha hızlı çalıştığını söylemek tabikide yanlış değil. Yazı güzel olmuş iyi çalışmalar.

    Cevapla
  • Emir , 09 Aralık 2014 - 18:20:51

    parametre olarak gelen yzıyı yıne kendısine göre parametre olarak gelen sayı kadar yazan REKURSİF fonksiyon yazınız

    diyor hocamaız acıl kardemişimmmm

    Cevapla
    • Abdullah , 25 Aralık 2015 - 17:58:49

      #include
      #include
      asal_bul(sayi)
      {
      int i,asal=1;
      if (sayi==0 || sayi==1) return 1;

      else
      {
      for(i=2;i<sayi;i++)
      {
      if(sayi%i==0) asal=0;
      }
      if(asal!=0)
      {
      printf("%d\n",sayi);

      }
      return asal_bul(sayi-1);
      }
      }
      main()
      {
      int sayi;
      printf("sayi giriniz ");
      scanf("%d",&sayi);
      asal_bul(sayi);

      }

      //duzgun bir sekilde calisiyor….

      Cevapla
  • Furkan , 09 Nisan 2015 - 23:46:02

    #include
    #include
    asal_bul(sayi) {
    int i,asal;
    if (sayi==0 || sayi==1) return 1;
    else {
    for(i=2;i “); scanf(“%d”,&sayi);
    asal_bul(sayi);
    getch();
    }
    kodda bir sorun var 10 girince 7yi yazdırmıyor??

    Cevapla
  • Taha Omurca , 01 Haziran 2016 - 12:41:47

    Allah senden razı olsun kardeş, ne zmandır araştırıyordum ancak bulamıyordum çok teşekkür ederim..

    Cevapla
  • Elif , 26 Kasım 2016 - 20:39:26

    Aşağıdaki metod ne işe yarar? B metodu özyinelemeli(recursive) olarak tekrar yazınız.
    Not: Recursive yazacağınız yeni metot için metot imzasını (alacağı parameterleri) değiştirmeniz gerekebilir.

    static bool MetotX(int [] array, int anahtar)
    { int i = 0, n = array.GetLength(0);
    for (i = 0; i < n; i++)
    { if (array[i] == anahtar)
    { return true; }
    }
    return false;
    }

    Cevapla

Yorum Yazın

Su elementleri kullanabilirsiniz : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Arama
RSS
Beni yukari isinla