Скачиваний:
0
Добавлен:
20.09.2026
Размер:
284 Кб
Скачать
☆
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.
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