ELN00 BİLGİSAYAR PROGRAMLAMA YİNELEME (RECURSION) Sunu Plnı Yinelemenin nlmı Yinelemeli fonksiyon tnımınd temel ve genel durum Bsit değişken tipleriyle yinelemeli fonksiyon oluşturm Dizi prmetreleriyle yinelemeli fonksiyon oluşturm Yinelemenin nsıl çlıştığının nlşılmsı
Yinelemeli fonksiyon çğrısı Yinelemeli çğrı, çğrıln fonksiyonun çğırn fonksiyonl ynı olduğu ir fonksiyon çğrısıdır. Diğer ir deyişle, fonksiyon kendi kendini çğırdığı zmn, yinelemeli çğrı oluşur. Burd kçınılmsı gereken, sonsuz döngüye girilmemesidir. Yinelemeli çözüme ulşmk Bir prolemin yinelemeli çözümü dikktli ir şekilde oluşturulmlıdır. Olmsı gereken, her yineleme dımının izi proleminin sit çözümüne ir dım dh yklştırmsıdır. Prolemin sit çözümüne temel durum dı verilmektedir. Her yineleme lgoritmsı en zındn ir temel durum ve ir genel(yineleme) durum içermelidir.
Yinelemeli Fonksiyonlr için genel ypı if (sit çözüm kullnılildiği durum geçerliyse) değilse sit çözümü uygul fonksiyonu yinele Genel durum Temel durum den n e kdr oln tmsyılrın toplnmsı için yinelemeli fonksiyon Prolem: toplm(4) fonksiyonun ypıln çğrının döndüreceği değer 0 olmlıdır. ++3+4 = 0 Prolemin sit çözümü, den kdr oln tmsyılrın toplmının olmsıdır. Böylece temel durumu şu şekilde çıkriliriz: if (n == ) return ; 3
den n e kdr oln tmsyılrın toplnmsı için yinelemeli fonksiyon Genel durum için: den n e kdr oln syılrın toplmı şu şekilde yzılilir: n + (n-) + (n-) + + vey n + ((n-) e kdr oln tmsyılrın toplmı) yni n + ((n-) + (n-) + + ) vey toplm(n) = n + toplm(n-) Burd görülmesi gereken, toplm(n-) diyerek, sit çözüm oln toplm() çözümüne ir dım dh yklşmmızdır. den n e kdr oln tmsyılrın toplnmsı için yinelemeli fonksiyon int toplm(int n) //n i (n-) e kdr oln toplm ekleyerek // den n e kdr oln syılrın toplmını ulur. //Önkoşul n e ir syı tnmış olmlı ve n>0 //Dönüş değeri: den n e kdr oln toplm if ( n == ) //temel durum return ; else return (n + toplm(n-)); //genel durum } 4
toplm(4) çğrı sırlmlrı return 4 + toplm(3) 4+6 = 0 Çğrı : toplm(4) n 4 return 3 + toplm() 3+3 = 6 Çğrı : toplm(3) n 3 return + toplm() + = 3 Çğrı 3: toplm() n n == return Çğrı 4: Toplm() n n fktöriyel hesı için yinelemeli fonksiyon Prolem: fkt(4) fonksiyon çğrısı 4 değerine ship olmlıdır, 4*3** = 4 Cevın ilindiği en sit çözüm, 0! = çözümüdür. Bu durumd temel durumumuz: if (syi == 0) return ; şeklinde oluşur.
n fktöriyel hesı için yinelemeli fonksiyon Genel durum: n. Syının fktöriyeli n*(n den önceki syılr) şeklinde yzılilir. n * (n-) * (n-) * (n-3) * * n * fkt(n-) Burd dikkt edilmesi gereken, her yineleme dımının izi fkt(0) temel durumun ir dım yklştırdığıdır. Yinelemeli Çözüm int fkt(int syi) //Önkoşul: syi değişkenine değer tnmış olmlı ve syi > 0 } if (syi == 0) else return ; return syi*fkt(syi -); 6
Diğer doğl olrk yinelemeli örnekler 0 = ve = * 4 Genel olrk x 0 = ve x n = x*x n- x tmsyısı için ve n > 0 Burd x n, x n- cinsinden yinelemeli olrk tnımlnilir. Üslü syılr örneği int Power(int x, int n) //Önkoşul: n >= 0, x ve n ynı nd 0 olmz. if ( n==0) //temel durum return ; else return ( x*power( x, n-)); //genel durum * Fonksiyon gövdesinde döngü kurmkt çözüm için diğer ir yoldur. 7
Dh geniş ir tnım -3 değeri nedir -3 = / 3 = / 8 Genel olrk x n = / x -n x n i, n < 0 durumund x -n cinsinden yinelemeli olrk tnımlyiliriz. power fonksiyonunun yinelemeli tnımı flot power(flot x, int n) //önkoşul: x!= 0 ve n tnmış olmsı } if (n == 0) return ; else if (n>0) return (x * power(x, n-)); else return (.0 / power(x, -n)); 8
Bzı durumlrd temel durum hiçir şey ypmmktır void yildizlri_yzdir(int n) //tek ir stırd n det yıldız yzdırır. //önkoşul: n tnmış olmlıdır. } if (n <= 0) //hiçirşey ypm else printf( * ); yildizlri_yzdir(n-); } if ( n > 0) printf( * ); yildizlri_yzdir(n-); } void yinelemeli fonksiyon yildizlri_yzdir(3) Çğrı : y_y(3) * yzdırıldi n 3 Çğrı : y_y() * yzdırıldi n Çğrı 3: y_y() * yzdırıldi n Çğrı 4: n y_(0) 0 hiçir şey ypm 9
Yinelemeli ir fonksiyon int ul(int, int ) //önkoşul: tnmış olmlı ve > 0 && tnmış olmlı ve >= 0 //Sonuç = if (<) //temel durum return 0; else return ( + ul(-, )); //genel durum } ul(0,4) return + ul(6,4) + = Çğrı : ul(0,4) 0 4 return + ul(,4) +0 = Çğrı : ul(6,4) 6 4 < return 0 Çğrı 3: toplm(,4) 4 0
Dizi elemnlrını ters sırd yzdırmk için yinelemeli fonksiyon Prolem Bu mçl şğıdki prototip kullnılcktır: void ters_yzdir(const int dizi[], int ilk, int son); 80FF4 3 4 9 Çğrı: ters_yzdir(dizi, 0, 3) fonksiyonunun üreteceği sonuç: 9 4 3 Temel Durum ve Genel Durum Temel durum, dh küçük elemnlı diziler cinsinden olilir. 0 elemnlı ir diziyle ypılilecek hiçir şey yoktur. Arycğımız genel çözüm, izi temel durum dım dım yklştırmlıdır. Yni, her yinelemeli çğrıd, işlenecek dizinin uzunluğu ir düşürülmelidir. Genel durumd ir elemn işlemek, ve en küçük diziye doğru ilerlemek, nihi olrk izi 0 elemnlı diziye ulştırcktır. Genel durumd, ilk elemnı d yzdıriliriz, dizi[ilk], vey son elemnı d yzdıriliriz, dizi[son]. Dizi[son] u yzdırck olursk; dizi[son] u yzdırdıktn sonr, hl ters dizilimle yzdırılck elemnlrımız olur.
Dizilerde yineleme kullnımı int ters_yzdir(const int dizi[], int ilk, int son) //dizi elemnlrını ters sırd yzdırır. //Önkoşul: ilk ve son tnmış olmlı, ilk < son if (ilk <= son) //genel durum printf( %d, dizi[son]); ters_yzdir(dizi,ilk,son-); } } //temel durum -- oş ters_yzdir(dizi,0,) Çğrı : ters_yzdir(dizi,0,) dizi[] yzildi ilk son Çğrı : ters_yzdir(dizi,0,) 0 ilk son 0 dizi[] yzildi Çğrı 3: ters_yzdir(dizi,0,0) dizi[0] yzildi ilk son Çğrı 4: ters_yzdir(dizi,0,-) hiçir şey ypm 0 0 ilk son 0 -
Yineleme & tekrrlm Şimdiye kdr yptığımız örneklerde, tekrrlm (itertion) yerine yineleme (recursion) kullnıldı. Tekrrlmlı çözümler döngüleri kullnırken, yinelemeli çözümler if ifdesini kullnmktdır. Bzı prolemler çısındn, yinelemeli çözümler çok dh doğl ir yol oluşturmktdır. Bu yöntem ilerleyen zmnd göreceğimiz gii, çoğunlukl ypılndırılmış (structured) değişkenleri kullnırken krşımız çıkck oln çözüm yöntemi olcktır. Bir fonksiyon çğrıldığınd Çğırn loktn çğrıln loğun ilk stırın doğru ir kontrol trnsferi gerçekleştirilir. Fonksiyon loğu çlıştırıldıktn sonr, çğırn lokt doğru yere ir geri dönüş gerçekleştirilmelidir. Bu doğru nokty geri dönüş(return) dresi dı verilmektedir. Bir fonksiyon çğrıldığınd, çlışm zmnı yığını(run-time stck) kullnılır. Bu yığının sonun fonksiyon çğrısıyl ilgili ir fliyet kydı yerleştirilir. 3
Yığın(Stck) fliyet pencereleri Fliyet kydı, u fonksiyon çğrısı için fonksiyonun dönüş dresini, değişken listesini, lokl değişkenlerini, ve dönüş değerini tutmk için gerekli yeri içerir. Fonksiyonun son kpnn küme prntezine erişildiğinde vey fonksiyon kodund return ifdesine erişildiğinde, o fonksiyon çğrısı için oluşturuln fliyet kydı yığındn geri lınır(popped off). Bu işlemden sonr, eğer void değilse, fonksiyonun dönüş değeri, çğırn loktki geri dönüş dresine yerleştirilir. Yinelemeli Fonksiyon int fonk(int, int ) //Önkoşul: ve tnmış olmlı //Sonuç: geri dönüş değeri int ; if ( == 0) //temel durum = 0; else if (>0) //ilk genel durum = + fonk(, -); //komut 0 else //. genel durum = fonk(-, -); //komut 70 return } 4
Yığın Fliyet Kyıtlrı x = fonk(,); //komut 00 deki orijinl çğrı 00 Komut 00 e ypıln çğrı fonk(,) için u kydı yığın yerleştirir. Yığın Fliyet Kyıtlrı x = fonk(,) ; //komut 00 deki orijinl çğrı 0 + fonk(,) 00 Komut 0 de ypıln çğrı fonk(,) için u kydı yığın yerleştirir. fonk(,) için kyıt
Yığın Fliyet Kyıtlrı x = fonk(,) ; 0 + fonk(,0) 0 + fonk(,) 00 //komut 00 deki orijinl çğrı Komut 0 de ypıln çğrı fonk(,0) için u kydı yığın yerleştirir. fonk(,) için kyıt fonk(,) için kyıt Yığın Fliyet Kyıtlrı x = fonk(,) //komut 00 deki orijinl çğrı 0 0 0 + fonk(,0) 0 + fonk(,) 00 fonk(,0) için kyıt değeriyle yığındn lınır fonk(,) için kyıt fonk(,) için kyıt 6
Yığın Fliyet Kyıtlrı x = fonk(,); //komut 00 deki orijinl çğrı + fonk(,0) = + 0 0 + fonk(,) 00 fonk(,) için kyıt değeriyle yığındn lınır Komut 00 e ypıln çğrı fonk(,) için u kydı yığın yerleştirir. Yığın Fliyet Kyıtlrı x = fonk(,); //komut 00 deki orijinl çğrı 0 + fonk(,) = + 00 fonk(,) için kyıt değeriyle yığındn lınır 7
Ödev 8 Vezir Prolemi Sekiz tne vezir strnç thtsı üzerine, iririni göremeyecek şekilde yerleştirilmelidir. Aynı stır, ynı sütun ve ynı diygonl üzerinde iki vezir krşı krşıy gelmeyecektir. Yerleşim, stır sütun numrlrı üzerinden gerçekleştirilecektir. Prolemin hem tekrrlmlı hem de yinelemeli çözümünü ulunuz. 8