Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5-LEKCIYA.docx
Скачиваний:
1
Добавлен:
27.11.2023
Размер:
962.25 Кб
Скачать

:: Ámeli.

Joqarıda belgilep ótilgenindey, lokal ózgeriwshi járiyalanıwı tap sonday attaǵi global ózgeriwshini «jasırad» hám bul orınnan global ózgeriwshige múráját etiw múmkinshiligi bolmay qaladı. C++ tilinde bunday jaǵdaylarda da global ózgeriwshige múráját etiw múmkinshiligi saqlanıp qalınǵan. Bunıń ushın «kóriniw aymaǵına ruxsat beriw» ámelinen paydalanıw múmkin hám ózgeriwshi aldına eki noqat – «::» qoyıw kerek boladı. Mısal retinde tómendegi programmanı keltiremiz:

#include <iostream.h>

//global ózgeriwshi járiyalanıwı

int ózg = 5;

int main()

{

//lokal ózgeriwshi járiyalanıwı

int ózg = 70;

//lokal ózgeriwshini shıǵarıw

cout << ózg << ‘/n’;

//global ózgeriwshini shıǵarıw

cout << :: ózg << ’/n’;

return 0;

}

Programma islewi nátiyjesinde ekranǵa aldın 70 hám keyin 5 sanları shıǵadı.

Rekursiv funkciyalar

Joqarıda belgilep ótilgenindey rekursiya dep funkciya denesinde usı funkciyanıń ózin shaqırıwǵa aytıladı. Rekursiya eki túrli boladı:

1. ápiwayı – eger funkciya óz denesinde ózin shaqırsa;

2. qurallı – eger birinshi funkciya ekinshi funkciyanı shaqırsa, ekinshisi

bolsa óz náwbetinde birinshi funkciyanı shaqırsa.

Ádette rekursiya matematikada keń qollanıladı. Sebebi kópshilik matematikalıq formulalar rekursiv anıqlanadı. Misal ushın faktorialdı esaplaw formulasın

Kórinip turǵanınday náwbettegi mánisti esaplaw ushın funkciyanıń “aldınǵı mánisi” belgili bolıwı kerek. C++ tilinde rekursiya matematikadaǵı rekursiyaǵa uqsas. Bunı joqarıdaǵı mısallar ushın dúzilgen funkciyalarda kóriw múmkin.

Faktorial ushın:

long F(int n)

{

if(!n)

return 1;

else

return n * F(n-1);

}

Berilgen haqıyqıy x sanınıń n-dárejesin esaplaw funkciyası:

double Pútin_Dáreje(double x, int n)

{

if(!n)

return 1;

else

return x * Pútin_Dáreje(x, n-1);

}

Eger factorial funkciyasına n > 0 mánis berilse, tómendegi jaǵday júz beredi: shárt operatorınıń else shaqındaǵı mánisi (n mánisi) stekte eslep qalınadı. Házirshe mánisi belgisiz n – 1 faktorialdı esaplaw ushın usı funkciyanıń ózi n – 1 mánisi menen shaqırıladı. Óz náwbetinde, bul mánis te yadlap qalınadı (stekke jaylastırıladı) hám jáne funkciya shaqırıladı h.t.b. Funkciya n = 0 mánis penen shaqırılǵanda if operatorınıń shárti (!n) shın boladı hám “return 1;” ámeli orınlanıp, tek usı shaqırıw boyınsha 1 mánisi qaytarıladı. Sonnan keyin “keri” process baslanadı – stekte saqlanǵan mánisler izbe – iz alınadı hám kóbeytiledi: aqırǵı mánis anıqlanǵannan keyin (1), ol onnan aldınǵı saqlanǵan mániske 1 mánisine kóbeytip F(1) mánisi esaplanadı, bul mánis 2 mánisine kóbeytiw menen F(2) tabıladı h.t.b. Process F(n) mánisin esaplawǵa shekem “kóbeytip” baradı. Bul processti, n = 4 ushın factorial sxemasın 2 – súwrette kóriw múmkin:

2-súwret. 4! Esaplaw sxeması

Rekursiv funkciyalardıń tuwrı ámel etiwi ushın rekursiv shaqırıwlardıń toqtaw shárti bolıwı kerek. Basqa jaǵdayda rekursiya toqtamawı hám óz náwbetinde funkciya jumısı juwmaqlanbawı múmkin. Faktorial esaplawında rekursiv túsiwlerdiń toqtaw shártinde funkciya parametri n = 0 bolıwı esaplanadı.

Hár bir rekursiv múráját qosımsha yad talap etedi – funkciyalardıń lokal obyektleri (ózgeriwshileri) ushın hár bir múrájátta stekten jańadan orın ajıratıladı. Máselen, rekursiv funkciyaǵa 100 mártebe múráját bolsa, jámi 100 lokal obyektlerdiń kompleksi ushın orın ajıratıladı. Ayrım jaǵdaylarda, yaǵnıy rekursiyalar sanı jeterli dárejede úlken bolǵanda, stek ólshemi sheklengenligi sebepli ol tolıp ketiwi múmkin. Bul jaǵdayda programma óz jumısın “Stek tolıp ketti” xabarı menen toqtatadı.

Tómende rekursiya menen qolaylı sheshiletuǵın “Xanoy minárası” máselesin kóreyik.

Másele. Úsh A, B, C qazıq hám n dana hár túrli ólshemli dóńgelekler bar.

Dóńgelekkerdiń ólshemleri ósiw tártibinde 1 den n ge shekem tártiplestirilgen. Basında barlıq dóńgelekler A qazıqqa 5.3a – súwrettegidey jaylastırılǵan. A qazıqtaǵı barlıq dóńgeleklerdi B qazıqqa, járdemshi C qazıqtan paydalanǵan halda, tómendegi qaǵıydalarǵa ámel qılǵan halda ótkeriw talap etiledi: dóńgeleklerdi birewden kóshiriw kerek hám úlken ólshemli dóńgelekti kishi ólshemli dóńgelek ústine qoyıw múmkin emes.

3-súwret. Xanoy minárası máselesin sheshiw processi

Kórsetpe: dóńgeleklerdi A dan B ǵa tuwrı ótkeriwde 5.3b – súwretlerdegi jaǵday júzege keledi, jańa n dóńgelekti A dan B ǵa ótkeriw máselesi n-1 dóńgelekti A dan C ǵa ótkeriw hámde bir dóńgelekti A dan B ǵa ótkeriw máselesine keledi. Onnan keyin C qazıqtaǵı n-1 dóńgelekti A qazıq járdeminde B qazıqqa ótkeriw máselesi júzege keledi h.t.b.

#include <iostream.h>

void Hanoy(int n, char a = 'A', char b = 'B', char c = 'C')

{

if(n)

{

Hanoy(n-1, a, с, b);

cout<<”Dóńgelek”<<a<<”dan”<<b<<”ǵa ótkerilsin\n”;

Hanoy(n-1, c, b, a);

}

}

int main()

{

unsigned int Dóńgelekler_Sanı;

cout << ”Hanoy minarası máselesi” << endl;

cout << ”Dóńgelekler sanın kiritiń:”;

cin >> Dóńgelekler_Sanı;

Hanoy(Dóńgelekler_Sanı);

return 0;

}

Dóńgelekler sanı 3 bolǵanda (Dóńgelekler_sanı = 3) programma ekranǵa dóńgeleklerdi kóshiriw boyınsha ámeller izbe-izligin shıǵaradı:

Dóńgelek A dan B ǵa ótkerilsin

Dóńgelek A dan C ǵa ótkerilsin

Dóńgelek B dan C ǵa ótkerilsin

Dóńgelek A dan B ǵa ótkerilsin

Dóńgelek C dan A ǵa ótkerilsin

Dóńgelek C dan B ǵa ótkerilsin

Dóńgelek A dan B ǵa ótkerilsin

Rekursiya shıraylı, ıqsham kóringeni menen yadtı únemlew hám esaplaw waqtın qısqartıw kóz-qarasınan onı ilajı barınsha iterativ esaplaw menen almastırılǵanı maqul. Máselen, x haqıyqıy sanınıń n-dárejesin esaplawdıń tómendegi sheshim variant salıstırmalı kem resurs talap qıladı (n-pútin belgisiz san):

double Pútin_Dáreje(double x, int n)

{

double p = 1;

for(int i = 1; i <= n; i++)

p *= x;

return p;

}

Ekinshi tárepten, sonday máseleler bar bolıp, olardı sheshiwde rekursiya júdá qolaylı, hátteki jalǵız usıl esaplanadı. Ásirese grammatikalıq analiz máselelerinde rekursiya júdá qolay esaplanadı.

Соседние файлы в предмете Программирование на C++