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
aran fonksiyonla ayn olduu bir fonksiyon arsdr. Dier bir deyile, fonksiyon kendi kendini ard zaman, yinelemeli ar oluur. Burada kanlmas gereken, sonsuz dngye girilmemesidir.
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.
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;
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)
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)
ar 4: Toplam(1)
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.
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
x0 = 1 ve xn = x*xn-1
x tamsays iin ve n > 0
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
xn = 1 / x-n
olarak tanmlayabiliriz.
yildizlari_yazdir(3)
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
Bu amala aadaki prototip kullanlacaktr: void ters_yazdir(const int dizi[], int ilk, int son);
80FF2245 13 42 25 59
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
ters_yazdir(dizi,0,2)
ar 1: ters_yazdir(dizi,0,2) dizi[2] yazildi
12
(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.
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
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
? ? 2 5 100
Yn Faaliyet Kaytlar
x = fonk(5,2) ; //komut 100deki orijinal ar
? ? 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
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
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
17
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