Eln 1002 Bilgisayar Programlama II Recursive Fonksiyonlar Ne ÖĆreneceĆiz? Recursion nedir? Recursive Fonksiyon tanımı Uygulama ve Örnekler Recursive Çözüm Tasarlama
Recursion Nedir? Birçok problem, kendisinin daha basit versiyonlarının birleştirilmesiyle çözülebilir. Recursion : Kendine bağlı olarak tanımlanan bir prosedürdür. Recursion ın bileşenleri : Base Case : Basit ve recursive olmayan çözüm. General Case : Recursive tanımlama Covergence : Base case e yaklaşma Kuyruk ğşlemleri
Örnek : Bir Say¹n¹n Faktöriyelini Bulma Tanım : n! = n X (n-1) X (n-2) X... X 1 Base Case : n = 0 veya n = 1 ise n! = 1 General Case : n! = n X (n-1) X (n-2) X... X 1 = n X (n-1)! Eğer n > 1 ise n! = n X (n-1)! Covergence : Her adımda n bir azaltılarak base case e yaklaşılıyor. Örnek : Bir Say¹n¹n Faktöriyelini Bulma
Örnek : Bir Say¹n¹n Faktöriyelini Bulma #include<stdio.h> /*fonksiyon prototipleri*/ int faktoriyel(int); int main() int sayi; printf("faktoriyeli bulunacak sayiyi giriniz : "); scanf("%d", &sayi); int fakt = faktoriyel(sayi); printf("%d! = %d", sayi, fakt); return 0; Faktöriyelin iteratif gerçeklenmesi : /*Foksiyon tanimlari*/ int faktoriyel(int n) int faktor; if(n<=1) faktor = 1; else faktor = n*faktoriyel(n-1); return faktor; Örnek : Fibonacci Say¹lar¹ Finobacci serisi : 0, 1, 1, 2, 3, 5, 8, 13, 21,... Tanım : 0 ve 1 ile başlar, sonraki sayılar kendinden önceki iki sayının toplamı ile oluşturulur. Base Case : fibonacci(0) = 0 fibonacci(1) = 1 General Case : fibonacci(n) = fibonacci(n-1) + fibonacci(n-2) Covergence : n azaltılarak base case e yaklaşılır.
Örnek : Fibonacci Say¹lar¹ Örnek : Fibonacci Say¹lar¹ #include<stdio.h> /*fonksiyon prototipleri*/ long fibonacci(int); int main() int sayi; long sonuc; printf("fibonacci degeri bulunacak bir sayi giriniz : "); scanf("%d", &sayi); sonuc = fibonacci(sayi); printf("fibonacci(%d) = %ld", sayi, sonuc); return 0; /*Fonksiyon tanimlari*/ long fibonacci(int n) long fib; if(n<=1) fib = n; else fib = fibonacci(n-1) + fibonacci(n-2); return fib; Fibonacci serisi iteratif olarak oluşturulabilir mi?
Örnek : Üst Alma Tanım : taban ust = taban X taban X taban X... X taban ust adet Base Case : taban 1 = taban veya taban 0 = 1 General Case : taban ust = taban X taban (ust-1) Covergence : ust bir azaltılarak base case e yaklaşılır. Örnek : Üst Alma #include<stdio.h> /*Fonksiyon prototipleri*/ double power(double, int); int main() int uss; double tab, sonuc; printf("tabani giriniz : "); scanf("%lf", &tab); printf("ustu giriniz : "); scanf("%d", &uss); sonuc = power(tab, uss); printf("(%lf)^%d = %lf", tab, uss, sonuc); return 0; /*Fonksiyon tanimlari*/ double power(double taban, int us) double test; if(us==0) test = 1; else test = taban*power(taban, us-1); return test;
Örnek : Dizi Elemanlar¹n¹n Toplam¹ Tanım : a N elemanlı bir dizi olmak üzere, a dizisinin elemanları toplamı a[0] + a[1] +... + a[n-1] olarak tanımlanır. Base Case : Eğer dizi boş ise toplam 0 dır veya Eğer dizi tek elemanlıysa toplam bu tek elemanın değerine eşittir. General Case : a dizisinin elemanları toplamı = son eleman + dizide kalan diğer elemanların toplamı Covergence : Dizide son elemandan başlayarak her eleman işleme sokulur ve dizinin boyu her adımda bir azaltılır ve base case e yaklaşılır. Örnek : Dizi Elemanlar¹n¹n Toplam¹ #include<stdio.h> /*Fonksiyon prototipleri*/ double topladizi(const double*, int); int main() double diz[] = 1.5, 2.5, 3.0, 1.0, 3.5; double sonuc = topladizi(diz, 5); printf("dizinin Elemanlari Toplami : %lf", sonuc); return 0; double topladizi(const double *dizi, int N) double toplam; if(n<0) toplam = 0; else toplam = dizi[n-1] + topladizi(dizi, N-1); Dizide baştan başlayarak recursive toplama işlemini gerçekleştirebilir miydik? Nasıl? return toplam;
Recursive Çözüm Tasarlama Problemi, kendinin daha basit versiyonlarını kullanabilecek şekilde nasıl parçalarım? Problemi farklı yollarla tekrar tanımla. Başlangıçta, ortada ve sonda anahtar adımları bul. Kendini tekrarlamayacak base case i bul. Recursive parçaların sıralanışını ve base case i organize et. Her zaman sonlanacağından emin ol. Recursion ile ilgili ağaç çiz. Gerekli zamanı analiz et (ağaç içindeki node sayısı). Gerekli yeri analiz et (ağaç derinliği). SONUÇ : Recursive mi? Iteratif mi?