Anda di halaman 1dari 18

ELN1002 BLGSAYAR PROGRAMLAMA 2

YNELEME (RECURSION)

Sunu Plan
Yinelemenin anlam Yinelemeli fonksiyon tanmnda temel ve genel

durum Basit deiken tipleriyle yinelemeli fonksiyon oluturma Dizi parametreleriyle yinelemeli fonksiyon oluturma Yinelemenin nasl altnn anlalmas

Yinelemeli fonksiyon ars


Yinelemeli ar, arlan fonksiyonun

aran fonksiyonla ayn olduu bir fonksiyon arsdr. Dier bir deyile, fonksiyon kendi kendini ard zaman, yinelemeli ar oluur. Burada kanlmas gereken, sonsuz dngye girilmemesidir.

Yinelemeli zme ulamak


Bir problemin yinelemeli zm dikkatli bir

ekilde oluturulmaldr. Olmas gereken, her yineleme admnn bizi probleminin basit zmne bir adm daha yaklatrmasdr. Problemin basit zmne temel durum ad verilmektedir. Her yineleme algoritmas en azndan bir temel durum ve bir genel(yineleme) durum iermelidir.

Yinelemeli Fonksiyonlar iin genel yap


if (basit zm kullanlabildii durum geerliyse) basit zm uygula deilse fonksiyonu yinele Temel durum Genel durum

1den ne kadar olan tamsaylarn toplanmas iin yinelemeli fonksiyon


Problem:

toplam(4) fonksiyonuna yaplan arnn dndrecei deer 10 olmaldr. 1+2+3+4 = 10 Problemin basit zm, 1den 1 kadar olan tamsaylarn toplamnn 1 olmasdr. Bylece temel durumu u ekilde karabiliriz:
if (n == 1) return 1;

1den ne kadar olan tamsaylarn toplanmas iin yinelemeli fonksiyon


Genel durum iin:

1den ne kadar olan saylarn toplam u ekilde yazlabilir:


n + (n-1) + (n-2) + + 1 veya n + ((n-1)e kadar olan tamsaylarn toplam) yani n + ((n-1) + (n-2) + + 1) veya toplam(n) = n + toplam(n-1)

Burada grlmesi gereken, toplam(n-1)

diyerek, basit zm olan toplam(1) zmne bir adm daha yaklamamzdr.

1den ne kadar olan tamsaylarn toplanmas iin yinelemeli fonksiyon


int toplam(int n) //ni (n-1)e kadar olan toplama ekleyerek //1den ne kadar olan saylarn toplamn bulur. //nkoul ne bir say atanm olmal ve n>0 //Dn deeri: 1den ne kadar olan toplam { if ( n == 1) //temel durum return 1; else return (n + toplam(n-1)); //genel durum }

toplam(4) ar sralamalar
return 4 + toplam(3) 4+6 = 10 ar 1: toplam(4) n 4 return 3 + toplam(2) 3+3 = 6 n 3 ar 3: toplam(2)

ar 2: toplam(3)

return 2 + toplam(1) 2+1 = 3


n 2 n == 1 return 1 n 1

ar 4: Toplam(1)

n faktriyel hesab iin yinelemeli fonksiyon


Problem:

fakt(4) fonksiyon ars 24 deerine sahip olmaldr, 4*3*2*1 = 24 Cevabn bilindii en basit zm, 0! = 1 zmdr. Bu durumda temel durumumuz:
if (sayi == 0) return 1; eklinde oluur.

n faktriyel hesab iin yinelemeli fonksiyon


Genel durum:

n. Saynn faktriyeli n*(nden nceki saylar) eklinde yazlabilir.


n * (n-1) * (n-2) * (n-3) * * 1 n* fakt(n-1)

Burada dikkat edilmesi gereken, her yineleme admnn bizi fakt(0) temel durumuna bir adm yaklatrddr.

Yinelemeli zm
int fakt(int sayi)
//nkoul: sayi deikenine deer atanm olmal ve sayi > 0

{ if (sayi == 0) return 1; else return sayi*fakt(sayi -1); }

Dier doal olarak yinelemeli rnekler


20 = 1 ve 25 = 2 * 24 Genel olarak

x0 = 1 ve xn = x*xn-1
x tamsays iin ve n > 0

Burada xn , xn-1 cinsinden yinelemeli olarak

tanmlanabilir.

sl saylar rnei
int Power(int x, int n)
//nkoul: n >= 0, x ve n ayn anda 0 olamaz. { if ( n==0) //temel durum return 1; else return ( x*Power( x, n-1)); //genel durum

* Fonksiyon gvdesinde dng kurmakta zm iin dier bir yoldur.

Daha geni bir tanm


2-3 deeri nedir? 2-3 = 1 / 23 = 1 / 8 Genel olarak

xn = 1 / x-n

xni, n < 0 durumunda x-n cinsinden yinelemeli

olarak tanmlayabiliriz.

power fonksiyonunun yinelemeli tanm


float power(float x, int n) //nkoul: x != 0 ve n atanm olmas { if (n == 0) return 1; else if (n>0) return (x * power(x , n-1)); else return (1.0 / power(x, -n)); }

Baz durumlarda temel durum hibir ey yapmamaktr


void yildizlari_yazdir(int n) //tek bir satrda n adet yldz yazdrr. //nkoul: n atanm olmaldr. { if (n <= 0) if ( n > 0) //hibirey yapma { else { printf(*); printf(*); yildizlari_yazdir(n-1); yildizlari_yazdir(n-1); } } } void yinelemeli fonksiyon

yildizlari_yazdir(3)

ar 1: n y_y(3) 3 * yazdrldi ar 2: y_y(2) * yazdrldi

n 2 ar 3: n y_y(1) 1 * yazdrldi ar 4: n y_b(0) 0 hibir ey yapma

Yinelemeli bir fonksiyon


int bul(int b, int a) //nkoul: a atanm olmal ve a > 0 &&b atanm olmal ve b >= 0 //Sonu = ??? { if (b<a) //temel durum return 0; else return ( 1 + bul(b-a, a)); //genel durum }

bul(10,4)
return 1 + bul(6,4) 1+1 = 2 ar 1: bul(10,4) b a 10 4 ar 2: bul(6,4) return 1 + bul(2,4) 1+0 = 1 b 6 a 4 b<a return 0 b 2 a 4

ar 3: toplam(2,4)

10

Dizi elemanlarn ters srada yazdrmak iin yinelemeli fonksiyon


Problem

Bu amala aadaki prototip kullanlacaktr: void ters_yazdir(const int dizi[], int ilk, int son);
80FF2245 13 42 25 59

ar: ters_yazdir(dizi, 0, 3) fonksiyonunun retecei sonu: 59 25 42 13

Temel Durum ve Genel Durum


Temel durum, daha kk elemanl diziler cinsinden

olabilir. 0 elemanl bir diziyle yaplabilecek hibir ey yoktur. Arayacamz genel zm, bizi temel duruma adm adm yaklatrmaldr. Yani, her yinelemeli arda, ilenecek dizinin uzunluu bir drlmelidir. Genel durumda bir eleman ilemek, ve en kk diziye doru ilerlemek, nihai olarak bizi 0 elemanl diziye ulatracaktr. Genel durumda, ilk eleman da yazdrabiliriz, dizi[ilk], veya son eleman da yazdrabiliriz, dizi[son]. Dizi[son]u yazdracak olursak; dizi[son]u yazdrdktan sonra, hala ters dizilimle yazdrlacak elemanlarmz olur.

11

Dizilerde yineleme kullanm


int ters_yazdir(const int dizi[], int ilk, int son)
//dizi elemanlarn ters srada yazdrr. //nkoul: ilk ve son atanm olmal, ilk < son { if (ilk <= son) //genel durum { printf(%d, dizi[son]); ters_yazdir(dizi,ilk,son-1); } } //temel durum -- bo

ters_yazdir(dizi,0,2)
ar 1: ters_yazdir(dizi,0,2) dizi[2] yazildi

ilk 0 son 2 ilk 0 son 1 ilk 0 son 0 ilk 0 son -1

ar 2: ters_yazdir(dizi,0,1) dizi[1] yazildi

ar 3: ters_yazdir(dizi,0,0) dizi[0] yazildi

ar 4: ters_yazdir(dizi,0,-1) hibir ey yapma

12

Yineleme & tekrarlama


imdiye kadar yaptmz rneklerde, tekrarlama

(iteration) yerine yineleme (recursion) kullanld. Tekrarlamal zmler dngleri kullanrken, yinelemeli zmler if ifadesini kullanmaktadr. Baz problemler asndan, yinelemeli zmler ok daha doal bir yol oluturmaktadr. Bu yntem ilerleyen zamanda greceimiz gibi, ounlukla yaplandrlm (structured) deikenleri kullanrken karmza kacak olan zm yntemi olacaktr.

Bir fonksiyon arldnda


aran bloktan arlan bloun ilk satrna

doru bir kontrol transferi gerekletirilir. Fonksiyon blou altrldktan sonra, aran blokta doru yere bir geri dn gerekletirilmelidir. Bu doru noktaya geri dn(return) adresi ad verilmektedir. Bir fonksiyon arldnda, alma zaman yn(run-time stack) kullanlr. Bu ynn sonuna fonksiyon arsyla ilgili bir faaliyet kayd yerletirilir.

13

Yn(Stack) faaliyet pencereleri


Faaliyet kayd, bu fonksiyon ars iin fonksiyonun

dn adresini, deiken listesini, lokal deikenlerini, ve dn deerini tutmak iin gerekli yeri ierir. Fonksiyonun son kapanan kme parantezine eriildiinde veya fonksiyon kodunda return ifadesine eriildiinde, o fonksiyon ars iin oluturulan faaliyet kayd yndan geri alnr(popped off). Bu ilemden sonra, eer void deilse, fonksiyonun dn deeri, aran bloktaki geri dn adresine yerletirilir.

Yinelemeli Fonksiyon
int fonk(int a, int b) //nkoul: a ve b atanm olmal //Sonu: geri dn deeri??? { int sonuc; if ( b == 0) sonuc= 0; else if (b>0) sonuc= a + fonk(a, b-1); else sonuc= fonk(-a, -b); return sonuc }

//temel durum //ilk genel durum //komut 50 //2. genel durum //komut 70

14

Yn Faaliyet Kaytlar
x = fonk(5,2); //komut 100deki orijinal ar

FCTVAL sonuc b a Geri Dn Adresi

? ? 2 5 100

Komut 100e yaplan ar fonk(2,5) iin bu kayd yna yerletirir.

Yn Faaliyet Kaytlar
x = fonk(5,2) ; //komut 100deki orijinal ar

FCTVAL sonuc b a Geri Dn Adresi FCTVAL sonuc b a Geri Dn Adresi

? ? 1 5 50 ? 5 + fonk(5,1) ? 2 5 100

Komut 50de yaplan ar fonk(5,1) iin bu kayd yna yerletirir. fonk(5,2) iin kayt

15

Yn Faaliyet Kaytlar
x = fonk(5,2) ; FCTVAL sonuc b a Geri Dn Adresi FCTVAL sonuc b a Geri Dn Adresi FCTVAL sonuc b a Geri Dn Adresi ? ? 1 5 50 ? 5 + fonk(5,0) 1 5 50 ? 5 + fonk(5,1) 2 5 100 //komut 100deki orijinal ar

Komut 50de yaplan ar fonk(5,0) iin bu kayd yna yerletirir. fonk(5,1) iin kayt

fonk(5,2) iin kayt

Yn Faaliyet Kaytlar
x = fonk(5,2) FCTVAL sonuc b a Geri Dn Adresi FCTVAL sonuc b a Geri Dn Adresi FCTVAL sonuc b a Geri Dn Adresi 0 0 1 5 50 ? 5 + fonk(5,0) 1 5 50 ? 5 + fonk(5,1) 2 5 100 //komut 100deki orijinal ar

fonk(5,0) iin kayt FCTVAL deeriyle yndan alnr

fonk(5,1) iin kayt

fonk(5,2) iin kayt

16

Yn Faaliyet Kaytlar
x = fonk(5,2); //komut 100deki orijinal ar

5 FCTVAL sonuc 5 + fonk(5,0) = 5 + 0 1 b 5 a 50 Geri Dn Adresi ? FCTVAL sonuc 5 + fonk(5,1) ? 2 b 5 a 100 Geri Dn Adresi

fonk(5,1) iin kayt FCTVAL deeriyle yndan alnr Komut 100e yaplan ar fonk(2,5) iin bu kayd yna yerletirir.

Yn Faaliyet Kaytlar
x = fonk(5,2); //komut 100deki orijinal ar

10 FCTVAL sonuc 5 + fonk(5,1) = 5 + 5 2 b 5 a 100 Geri Dn Adresi

fonk(5,2) iin kayt FCTVAL deeriyle yndan alnr

17

dev 8 Vezir Problemi


Sekiz tane vezir satran tahtas zerine,

birbirini gremeyecek ekilde yerletirilmelidir. Ayn satr, ayn stun ve ayn diyagonal zerinde iki vezir kar karya gelmeyecektir. Yerleim, satr stun numaralar zerinden gerekletirilecektir. Problemin hem tekrarlamal hem de yinelemeli zmn bulunuz.

18

Anda mungkin juga menyukai