Скачиваний:
0
Добавлен:
20.09.2026
Размер:
619 Кб
Скачать
☆
8-lekciya. Rekursiv funkciyalar menen islew. Funkciya anıqlaması. Rekursiv
funkciya. Paydalanıwshı kitapxanasın shólkemlestiriw.
Funkciyalar hám óz denesinde basqa funkciyalardı, ózin de shaqırıwı
múmkin. Óz denesinde ózin shaqıratuǵın funkciyalarǵa rekursiv funkciyalar
delinedi.
C++ tilindegi hár qanday programmada albette main() bas funkciyası bolıwı
shárt. Tap usı main() funkciyasınıń júklewshi tárepinen shaqırılıwı menen
programma orınlanıwı baslanadı.
qaytıw sxeması kórsetilgen.
Programma main() funkciyasın orınlawdan baslanadı hám «f1(x,y)» ­funkciya shaqırıwǵa shekem dawam etedi hám keyin basqarıw f1(x,y) funkciya denesindegi ámelderdi orınlawǵa ótedi. Bunda Radius parametriniń mánisi
sıpatında funkciya x ózgeriwshi mánisin, Symbol parametri sıpatında y ózgeriwshiniń mánisi isletiledi. Funkciya denesi return operatorına shekem
orınlanadı. return operatorı basqarıwdı main() funkciyası denesindegi f1() funkciyası shaqırılǵan operatordan keyingi operatorǵa ótiwdi támiynleydi, yaǵnıy funkciyadan qaytıw júzege keledi. Sonnan keyin main() funkciyası operatorları orınlanıwında dawam etedi hám «f2(a,b,c)» - funkciya shaqırılıwı arqalı basqarıw f2() funkciya denesine ótedi hám esaplaw proсessinde sáykes túrde Yes-No sıpatında a ózgeriwshisiniń, count sıpatında b ózgeriwshisiniń hám key sıpatında c ózgeriwshisiniń mánisleri isletiledi. Funkciya denesindegi return operatorı yaki aqırǵı operator orınlaǵannan keyin avtomat túrde bas funkciyaǵa qaytıw ámelge asırıladı.
Kópshilik jaǵdaylarda main() funkciyasınıń parametrler dizimi bos boladı. Eger júkleniwshi programmanı iske túsiriwde buyrıq qatarı arqalı júkleniwshi programma iske túsirilgende oǵan parametrlerdi uzatıw kerek bolsa, main() programması funkciyasınıń sintaksisi ózgeredi:
int main (int argc, char*argv[]);
Bul jerde argc – uzatılatuǵın parametrler sanı, argv[] – bir-birinen punktuaciya belgileri (hám probel) menen ajıratılǵan parametrler dizimin óz ishine
alǵan massivke kórsetkish.
Tómende funkciyalardı járiyalaw, shaqırıw hám anıqlawǵa mısallar
keltirilgen:
//funkciyalar járiylanıwı
int meniń_funkciyam(int Number, float Point);
char Belgini_oqıw();
void bitti_ornatıw(short Num);
void Ámel_joq(int, char);
//funkciyalardı shaqırıw
result = Meniń_funkciyam(Varb1,3.14);
symb = Belgini_oqıw();
bitti_ornatıw(3);
Ámel_joq(2,Smbl);
//funkciyalardı anıqlaw
int Meniń_funkciyam(int Number, float Point)
{
int x;
...
return x;
}
char belgini_oqıw()
{
char Symbol;
cin >> Symbol;
return Symbol;
};
void bitti_ornatıw(short number)
{
global_bit = global_bit | number;
};
void Ámel_joq(int x, char ch){};
Funkciyanıń programmadaǵı ornın jánede túsinikli bolıwı ushın san kvadratın esaplaw máselesinde funkciyadan paydalanıwdı kóreyik.
Funkciya prototipin baslama.h baslama faylında jaylastıramız:
long San_Kvadratı(int);
Tiykarǵı programmada usı baslama faylın qosıw arqalı San_Kvadratı()funkciya járiyalanıwı programma tekstine kiritiledi:
#include <iostream.h>
#include <sarlavha.h>
int main()
{
int Ózgeriwshi = 5;
cout << San_Kvadratı(Ózgeriwshi);
return 0;
}
long San_Kvadratı(int x)
{
return x * x;
}
Tap usı máseleni baslama faylınan paydalanbaǵan halda funkciya járiyalanıwın programma tekstine jazıw arqalı da sheshiw múmkin:
#include <iostream>
long San_Kvadratı(int);
int main()
{
int Ózgeriwshi = 5;
cout << San_Kvadratı(Ózgeriwshi);
return 0;
}
long San_Kvadratı(int x)
{
return x * x;
}
Programma isleniwinde ózgeris bolmaydı hám natiyje sıpatında ekranǵa 25 sanın shıǵaradı.
Másele. Eki ápiwayı san «egizek» delinedi, eger olar bir-birinen 2 ge parıq qılsa (máselen, 41 hám 43 sanları). Berilgen natural n ushın [n..2n] aralıqtaǵı barlıq egizek» sanlar juplıqları shıǵarılsın. Máseleni sheshiw ushın berilgen k sanınıń
ápiwayı san yamasa ápiwayı san emesligin anıqlawshı logikalıq funkciyanı dúziw zárúr boladı. Funkciyada k sanı 2..k/2 ge shekem sanlarǵa bólinedi, eger k bul sanlardıń birewinede bólinbese, ol ápiwayı san esaplanadı hám funkciya true mánisin qaytaradı. Bas funkciyada, berilgen n ushın [n..2n] aralıqtaǵı (n, n+2), (n+1,n+3),…(2n-2, 2n) san juplıqlarınıń ápiwayı sanlar ekenligi tekseriledi hám shártti qanaatlantıratuǵın juplıqlar shıǵarıladı.
Programma kodı:
bool ÁpiwayıSan(unsigned long k);
int main()
{
unsigned long n, i;
unsigned char egizek = 0;
cout << ‛n -> ‛;
cin >> n;
cout << ’[‘ << n << ‛..‛ << 2 * n << ’]’;
for(i = n; i <= 2 * n - 2; i++)
if(ÁpiwayıSan(i) && ÁpiwayıSan(i + 2))
{
if(!egizek)
cout << ‛aralıǵındaǵı egizek ápiwayı sanlar:\n‛;
else
cout<<‛; ‛;
egizek = 1;
cout << ’{‘ << i << ’,’ << i + 2 << ’}’;
}
if(!egizek)
cout << ‛ aralıǵında egizek ápiwayı sanlar joq.‛;
;
else cout << ’.’;
return 0;
}
bool ÁpiwayıSan(unsigned long k)
{
unsigned long m;
for(m = 2; m <= k / 2; m++)
if(k % m == 0)
return false;
return true;
}
Natural n sanı ushın 100 kiritilse, programma tómendegi sanlar juplıqların shıǵaradı:
[100..200] aralıqtaǵı egizek ápiwayı sanlar:
{101,103}; {107,109}; {137,139}; {149,151};
{179,181}; {191,193}; {197,199}.
Kelisim boyınsha argumentler
C++ tilinde funkciya shaqırılǵanda ayrım argumentlerdi túsirip qaldırıw múmkin. Buǵan funkciya prototipinde usı parametrlerdiń kelisim boyınsha mánislerin kórsetiw arqalı erisiw múmkin. Máselen, tómende prototipi keltirilgen funkciya hár túrli shaqırıwǵa iye bolıwı múmkin:
//funkciya prototipi
void Pútin_San(int i, bool Bayraq = true, char Blg = ’\n’);
//funkciyanı shaqırıw variantları
Pútin_San(1, false, ‘a’);
Pútin_San(2, false);
Pútin_San(3);
Birinshi shaqırıwda barlıq parametrler sáykes argumentler arqalı mánislerin qabıl etedi, ekinshi jaǵdayda i parametri 2 mánisin, Bayraq parametri false mánisin hám Blg ózgeriwshisi kelisim boyinsha „\n‟ mánisin qabıl etedi.
Kelisim boyınsha mánis beriwdiń bir shárti bar - parametrler diziminde kelisim boyınsha mánis berilgen parametrlerden keyingi parametrler de kelisim boyınsha mániske iye bolıwı shárt. Joqarıdaǵı mısalda i parametri kelisim boyınsha mánis qabıl etken jaǵdayda, Bayraq yaki Blg parametrleri mánissiz bolıwı múmkin emes. Mısal retinde, berilgen sandı kórsetilgen anıqlıqta shıǵarıwshı programmanı qarayıq. Qoyılǵan máseleni sheshiwde sandı dárejege asırıw funkciyası - pow() hám jıljıwshı nóqatlı uzın sannan modul alıw fabs1() funkciyasınan paydalanıladı. Bul funkciyalar prototipi <math.h> baslama faylında jaylasqan (3-qosımshaǵa qarań):
#include <iostream>
#include <math.h>
void Shıǵarıw(double Numb, double Anıqlıq = 1, bool Bayraq =
true);
int main ()
{
double Mpi = -3.141592654;
Shıǵarıw(Mpi, 4, false);
Shıǵarıw(Mpi, 2);
Shıǵarıw(Mpi);
return 0;
}
void Shıǵarıw(double Numb, double Anıqlıq = 1, bool Bayraq =
true)
{
if(!Bayraq)
Numb = fabsl(Numb);
Numb = (int)(Numb * pow(10, Anıqlıq));
Numb = Numb / pow(10, Aniqliq);
cout << Numb << ‘\n’;
}
Programmada sandı túrli anıqlıqta (Anıqlıq parametri mánisi arqalı) shıǵarıw ushın hár túrli variantlarda shiǵariw() funkciyası shaqırılǵan. Programma islewi natiyjesinde ekranǵa tómendegi sanlar shıǵarıladı:
3.1415
-3.14
-3.1
Parametrdiń kelisimi boyınsha beriletuǵın mánisi turaqlı, global ózgeriwshi yaki qandayda bir funkciya tárepinen qaytarılatuǵın mánis bolıwı múmkin.
Lokal hám global ózgeriwshiler.
Ózgeriwshiler funkciya denesinde yaki onnan sırtta járiyalanıwı múmkin. Funkciya ishinde berilgen ózgeriwshilerge lokal ózgeriwshiler delinedi. Bunday ózgeriwshiler yadtaǵi programma steginde jaylasadı hám tek ózi járiyalanǵan funkciya denesinde ámelga asırıladı. Basqarıw tiykarǵı funkciyaǵa qaytıwı menen lokal ózgeriwshiler ushın ajıratılǵan yad bosatıladı (óshiriledi).
Hár qanday ózgeriwshi óziniń ámel qılıw aymaǵı hám jasaw waqtı qásiyetleri menen xarakterlenedi.
Ózgeriwshi ámel qılıw aymaǵı degende ózgeriwshini isletiw múmkin bolǵan programma aymaǵı (bólegi) túsiniledi. Bul túsinik penen ózgeriwshiniń kóriniw aymaǵı túsinigi tuwrıdan-tuwrı baylanıslı. Ózgeriwshi ámel qılıw aymaǵınan shıqqanda kórinbey qaladı. Ekinshi tárepten, ózgeriwshi ámel qılıw aymaǵında bolıwı, biraq kórinbewi múmkin. Bunda kóriniw aymaǵına ruxsat beriw ámeli «::» járdeminde kórinbes ózgeriwshige muráját etiw múmkin boladı.
Ózgeriwshiniń jasaw waqtı dep, ol bar bolǵan programma bóleginiń orınlanıwına ketken waqıt intervalına aytıladı.
Lokal ózgeriwshiler ózleri járiyalanǵan funkciya yaki blok shegarasında kóriniw aymaǵına iye. Bloktaǵı ishki bloklarda tap usı attaǵı ózgeriwshi
járiyalanǵan bolsa, ishki blokta bul lokal ózgeriwshi de ámel qılmay qaladı. Lokal ózgeriwshi jasaw waqtı - blok yamasa funkciyanı orınlaw waqtı menen anıqlanadı. Bul jaǵday sonı bildiredi, túrli funkciyalarda bir-birine ulıwma baylanıslı bolmaǵan birdey attaǵı lokal ózgeriwshilerdi isletiw múmkin.
Tómendegi programmada main() hám sum() funkciyalarında birdey attaǵı ózgeriwshilerdi isletiw kórsetilgen. Programmada eki sannıń qosındısı esaplanadı hám shıǵarıladı:
#include <iostream.h>
//funkciya prototipi
int sum(int a, int b);
int main()
{
//lokal ózgeriwshiler
int x = 1;
int y = 4;
cout << sum(x, y);
return 0;
}
int sum(int a, int b)
{
//lokal ózgeriwshi
int x = a+b;
return x;
}
Global ózgeriwshiler programma tekstinde funkciya anıqlanıwınan sırtta járiyalanadı hám járiyalanǵan jerinen baslap programma aqırına shekem ámel qıladı.
#include <iostream.h>
int f1();
int f2();
int main ()
{
cout << f1() << ‛ ‛ << f2() << endl;
return 0;
}
int f1()
{
return x; //kompilyaciya qátesi júz beredi
}
int x = 10; //global ózgeriwshi járiyalanıwı
int f2()
{
return x * x;
}
Joqarıda keltirilgen programmada kompilyaciya qátesi júz beredi, sebebi f1() funkciya ushın x ózgeriwshisi belgisiz esaplanadı.
Programma tekstinde global ózgeriwshilerdi olar járiyalanǵannan keyin jazılǵan qálegen funkciyada isletiw múmkin. Sol sebepli, global ózgeriwshiler programma tekstiniń basında jazıladı. Funkciya ishinen global ózgeriwshige múráját etiw ushın funkciyada onıń atı menen birdey atta lokal ózgeriwshiler bolmawı kerek. Eger global ózgeriwshi járiyalanıwında oǵan baslanǵısh mánis berilmegen bolsa, olardıń mánisi 0 esaplanadı. Global ózgeriwshiniń ámel qılıw aymaǵı onıń kóriniw aymaǵı menen ústi-ústine tusedi (birdey).
Sonı aytıp ótiw kerek, tájiriybeli programma dúziwshiler múmkinshiligi barınsha global ózgeriwshilerdi isletpewge háreket etedi, sebebi bunday ózgeriwshiler mánisi programmanıń qálegen jerinen ózgertiw qáwpi barlıǵı sebepli programma islewinde mazmunı tárepten qáteler júzege keliwi múmkin. Bul pikirimizdi tastıyıqlaw ushın mısal kóreyik:
#include <iostream.h>
//global ózgeriwshi járiyalanıwı
int test = 100;
void Shıǵarıw(void);
int main()
{
//lokal ózgeriwshi járiyalanıwı
int test = 10;
//global ózgeriwshi shıǵarıw funkciyasın shaqırıw
Shıǵarıw();
cout << ‛Lokal ózgeriwshi: ‚ << test <<’\n’;
return 0;
}
void Shıǵarıw(void)
{
cout << ‛Global ózgeriwshi: ‚ << test <<’\n’;
}
Programma basında test global ózgeriwshisi 100 mánisi menen járiyalanadı. Keyin, main() funkciyasında test atı menen lokal ózgeriwshisi 10 mánisi menen járiyalanadı. Programmada Shıǵarıw() funkciyasına múráját etilgende, tiykarǵı funkciya denesinen waqtınsha shıǵıladı hám natiyjede main() funkciyasında
járiyalanǵan barlıq lokal ózgeriwshilerge múráját etiw múmkin bolmay qaladı. Sol sebepli, Shıǵarıw() funkciyasında global test ózgeriwshisiniń mánisi shıǵarıladı. Tiykarǵi programmaǵa qaytılǵannan keyin, main() funkciyasındaǵı lokal test ózgeriwshisi global test ózgeriwshisin «jasıradı» hám lokal test ózgeriwshiniń mánisi shıǵarıladı. Programma islewi nátiyjesinde ekranǵa tómendegi nátiyjeler shıǵarıladı:
Global ózgeriwshi: 100
Lokal ózgeriwshi: 10
:: á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ǵı
Соседние файлы в папке 1-semestr