Добавил:
bekan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:1-semestr / 8-Lekciya_2
.pdf
8-Lekciya. Rekursiv funkciyalar menen islew. Funkciya anıqlaması. Rekursiv funkciya.
Paydalanıwshı kitapxanasın shólkemlestiriw.
Jobası:
1. Rekursiv funkciya anıqlaması
2. Rekursiv funkciyalar menen islew
Rekursiv funkciya ‒ bul funkciyanıń ózin-ózi shaqırıw texnikası. Bul texnika quramalı
máselelerdi sheshiw ushın olardı ápiwayı máselelerge bólip sheshiwge járdem beredi.
Rekursiyanı túsiniw biraz qıyın bolıwı múmkin. Onıń qalay isleytuǵının túsiniwdiń eń
jaqsı jolı - onı tájiriybe arqalı úyreniw.
Rekursiya mısalı
Eki sandı qosıw ápiwayı, biraq sanlar qatarın qosıw quramalıraq. Tómendegi mısalda
rekursiya sanlar qatarın qosıw ushın qollanıladı, bul máseleni eki sandı qosıwdıń ápiwayı
wazıypasına bólip isleymiz:
Mısal
int sum(int k) {
if (k > 0) {
return k + sum(k - 1);
} else {
return 0;
}
}
int main() {
int result = sum(10);
cout << result;
return 0;
}
Nátiyje: 55
Mısaldıń túsindirmesi
sum() funkciyası shaqırılǵanda, k parametrin ózinen kishi bolǵan barlıq sanlardıń qosındısına
qosadı hám nátiyjesin qaytaradı. k nolge teń bolǵanda, funkciya tek noldi qaytaradı. Programma
orınlanǵanda, tómendegi basqıshlar boyınsha isleydi:
10 + sum(9)
10 + ( 9 + sum(8) )
10 + ( 9 + ( 8 + sum(7) ) )
...
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + sum(0)
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0
k nolge teń bolǵanda funkciya óz-ózin shaqırmaytuǵın bolǵanlıqtan, programma sol jerde
toqtaydı hám nátiyje qaytaradı.

Programmalastırıw joybarın islep shıǵıwshı rekursiya menen jumıs islegende júdá abaylı bolıwı
kerek, sebebi hesh qashan tamamlanbaytuǵın yamasa júdá kóp operativ yad yamasa processor
waqtın paydalanatuǵın funkciya jazıp qoyıw múmkin. Degen menen, durıs jazılǵanda rekursiya
júdá nátiyjeli hám matematikalıq jaqtan ájayıp programmalastırıw usılı bolıp tabıladı.
Joqarıdaǵı mısaldı jáne de túsinikli bolıw ushın izbe-iz táriypleymiz:
1. Funkciya anıqlaması:
int sum(int k) {
sum dep atalatuǵın funkciya járiyalanadı
int qaytarıw tipi, yaǵniy funkciya pútin san qaytaradı
k - funkciyaǵa kiretuǵın parametr, ol da pútin san
2. Shártli operator:
if (k > 0) {
Eger k nolden úlken bolsa, tómendegi blok orınlanadı
3. Rekursiyalıq shaqırıw:
return k + sum(k - 1);
Házirgi k mánisi menen k-1 ushın sum() funkciyasın qaytadan shaqırıwdıń qosındısın
qaytaradı
Mısalı, eger k=3 bolsa: 3 + sum(2) boladı
4. Alternativalıq jaǵday:
} else {
return 0;
}
Eger k nolge teń yamasa kishi bolsa, 0 qaytaradı
Bul rekursiyanı toqtatıw shártı bolıp esaplanadı
5. Baslı funkciya:
int main() {
Programmanıń baslanǵısh noqatı
6. Funkciyani shaqırıw hám nátiyje alıw:
int result = sum(10);
sum() funkciyası 10 sanı menen shaqırıladı
Nátiyje result ózgeriwshisine saqlanadı
Bul 10+9+8+7+6+5+4+3+2+1+0 qosındısın esaplaydı
7. Nátiyjenı shıǵarıw:

cout << result;
Esaplanǵan nátiyje ekranǵa shıǵarıladı
8. Programmanı juwmaqlaw:
return 0;
Programma tabıslı orınlandı degen signaldı qaytaradı
Bul kod 1 den 10 ǵa shekemgi sanlar qosındısın esaplaydı hám 55 sanın ekranǵa shıǵaradı.
2-mısal:
Faktorialdı esaplaw ushın rekursiv funkciya - bul rekursiyanıń eń ápiwayı hám kóp
qollanılatuǵın mısallarınıń biri. Mısal:
#include <iostream>
using namespace std;
int factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
int main() {
int san = 5;
cout << san << "! = " << factorial(san);
return 0;
}
Bul programma 5 faktorialdı esaplaydı (5!) hám nátiyje 120 boladı, sebebi:
5! = 5 * 4 * 3 * 2 * 1 = 120
Kodqa táriyip:
1. Kitapxanalardı qosıw:
#include <iostream>
using namespace std;
iostream - kiris/shıǵıs ámellerı ushın kitapxana
using namespace std - standart namespace ti qollanıw ushın
2. Funkciya anıqlaması:
int factorial(int n) {
factorial dep atalatuǵın funkciya jariyalanadı
int qaytarıw tipi - pútin san qaytaradı
n - faktorialı esaplanıwı kerek bolǵan san

3. Toqtaw shártı:
if (n <= 1) {
return 1;
}
Eger n 1 ge teń yamasa kishi bolsa, 1 qaytaradı
Bul rekursiyanı toqtatatuǵın shárt
1! = 1 hám 0! = 1 bolǵanlıqtan, usınday shárt qoyıladı
4. Rekursiv shaqırıw:
return n * factorial(n - 1);
Házirgi sandı (n) onnan bir kishi sannıń faktorialına kóbeytedi
Mısalı, eger n=5 bolsa:
o 5 * factorial(4)
o 5 * (4 * factorial(3))
o 5 * (4 * (3 * factorial(2)))
o 5 * (4 * (3 * (2 * factorial(1))))
o 5 * (4 * (3 * (2 * 1)))
o 5 * 4 * 3 * 2 * 1 = 120
5. Baslı funkciya:
int main() {
Programmanıń baslanǵısh noqatı
6. Ózgeriwshi jariyalaw hám mán beriw:
int san = 5;
san ózgeriwshisi jariyalanadı hám oǵan 5 mánis beriledi
7. Nátiyjenı shıǵarıw:
cout << san << "! = " << factorial(san);
Ekranǵa sannıń ózi, "!" belgisi hám faktorial nátiyjesin shıǵaradı
Nátiyjede: "5! = 120" kórinisinde shıǵadı
8. Programmanı juwmaqlaw:
return 0;
Programma tabıslı orınlandı degen signaldı qaytaradı
Bul kod 5 sanınıń faktorialın esaplaydı hám 120 sanın ekranǵa shıǵaradı. Rekursiya usı jerde hár
bir qádemde sannıń ózin onnan kishi sannıń faktorialına kóbeytiw arqalı ámelge asırıladı.

TEST
1. Tómendegi kodtıń nátiyjesin tabıń:
int func(int n) {
if (n <= 1) return 1;
return n + func(n - 1);
}
// func(4) neni qaytaradı?
a) 4 b) 8 c) 10 d) 12
2. Factorial funkciyanıń rekursiv variantında tiykarǵı jaǵday (base case) qaysı?
a) n == 1
b) n == 0
c) n == 0 yamasa n == 1
d) n < 0
3. Tómendegi rekursiv funkciya neni esaplaydı?
int mystery(int n) {
if (n == 0) return 0;
return n % 10 + mystery(n / 10);
}
a) Sannıń cifrlarin kóbeytiwin b) Sannıń cifrlarınıń qosındısın c) Sannıń uzınlıǵın d) Sannıń taq
cifrlarınıń qosındısın
4. Qaysı jaǵdayda rekursiv funkciya sheksiz ciklge túsedi? a) Tiykarǵı jaǵday joq bolǵanda
b) Return operatorı joq bolǵanda c) Parametr joq bolǵanda d) A hám B variantları durıs
5. Fibonachchi sanların esaplaytuǵın rekursiv funkciyada ne ushın 2 rekursiv shaqırıw bar?
a) Tezlikti arttırıw ushın b) Hár bir san aldınǵı eki sannıń qosındısı bolǵanlıqtan c)
Qáteliklerdi azaytıw ushın d) Programmanı quramalı etiw ushın
6. Tómendegi kodtıń shıǵısı qanday boladı?
void print(int n) {
if (n < 1) return;
cout << n << " ";
print(n - 1);
cout << n << " ";
}
// print(3) shaqırılǵanda
a) 3 2 1 1 2 3 b) 3 2 1 3 2 1 c) 1 2 3 3 2 1 d) 3 2 1
7. Stack overflow qáteligi rekursiv funkciyalarda qashan júz beredi? a) Funkciya judá kóp
márte shaqırılǵanda b) Funkciyada return operatorı joq bolǵanda c) Funkciya parametri
durıs emes bolǵanda d) Funkciya denesi bos bolǵanda
8. Tómendegi kodtıń nátiyjesin tabıń:
int power(int x, int n) {
if (n == 0) return 1;
return x * power(x, n-1);
}
// power(2, 3) neni qaytaradı?

a) 6 b) 8 c) 12 d) 16
9. Rekursiv funkciyalardıń qanday kemshilikleri bar? a) Judá kóp esaplaw resursın
paydalanıwı b) Orınlanıw tezligi pásligi c) Programmanı quramalı etiwi d)
Joqarıdaǵılardıń barlıǵı
10. Qaysı jaǵdayda iterativ usıl rekursiv usılǵa qaraǵanda nátiyjelirirek? a) Úlken sanlar
menen islegende b) Kishi sanlar menen islegende c) Hár waqıtta d) Hesh qashan
Juwapları:
1. c) 10 (4 + 3 + 2 + 1 = 10)
2. c) n == 0 yamasa n == 1
3. b) Sannıń cifrlerin qosındısın
4. d) A hám B variantları durıs
5. b) Hárbir san aldınǵı eki sannıń qosındısı bolǵanlıqtan
6. a) 3 2 1 1 2 3
7. a) Funkciya jutá kóp márti shaqırılǵanda
8. b) 8 (2 * 2 * 2 = 8)
9. d) Joqarıdaǵılardıń barlıǵı
10. a) Úlken sanlar menen islegende
Соседние файлы в папке 1-semestr
