Добавил:
bekan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:1-semestr / 8-LEKCIYA
.pdf
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ı.
1-súwret. Bas funkciyadan basqa funkciyalardı shaqırıw hám qaytıw
1 – súwrette bas funkciyadan basqa funkciyalardı shaqırıw hám olardan
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
