Funksiyalar. Rekursiv funksiyalar.

Download Report

Transcript Funksiyalar. Rekursiv funksiyalar.

FUNKSIYALAR. REKURSIV
FUNKSIYALAR.
TAYYORLADI: 1-KURS MAGISTRANTI AZAT YUSUPOV.
`
TATU URGANCH FILIALI 03.02.2014
FUNKSIYALAR.
Funksiya – dastur kodining biror nomlangan qismi
bo’lib, unga boshqa funksiyalardan va asosiy
(main) funksiyasidan murojaat qilish mumkin. Aniq
bir vazifani bajaradi, birnecha marta murojaat
qilinishi mumkin.
Masala.
Ikkita a va b sonlari berilgan. Ularning har birining
raqamli ildizlarini toping.
Raqamli ildizni xisoblaganda sonning raqamlarini
qo’shamiz. Agar u bir xonali son bo’lmasa bu
jarayonni toki bir xonali son bo’lgunga qadar
davom ettiramiz.
Masalan a = 2356474;
1) a = 2356474 > 9, a = 2+3+5+6+4+7+4=31;
2) a = 31 > 9, a = 3+1=4;
3) a = 4 <= 9; Javob : 4;
int digidal_root(int a) {
while (a > 9) {
int sum = 0;
while (a > 0) {
sum += a % 10;
a /= 10;
}
a = sum;
}
return a;
}
Funksiya parametri sifatida massiv uzatish.
Masala:
Bir o’lchamli massivning [L..R] elementlarining yig’indisini funksiya
yordamida topuvchi dastur tuzing.
Masalan : int a[] = {1, 4, 6, 14, 32, 7, 9}
sumArray(a, 0, 3) = a[0]+a[1]+a[2]+a[3] = 1+4+6+14 = 25
sumArray(a, 2, 3) = a[2]+a[3] = 6+14 = 20
Bu masalada funksiyaga parametr sifatida massiv va uning
boshlang’ich va ohirgi insekslari uzatiladi.
int sumArray(int a[], int L, int R) {
int sum = 0;
for (int i = L; i <= R; i++) {
sum += a[i];
}
return sum;
}
int main(){
int a[] = {1, 4, 6, 14, 32, 7, 9};
cout<< sumArray(a, 1, 4) ;
int b[] = {4, 67, 13, 56, 61, 4};
cout<< sumArray(b, 2, 3) ;
}
Funksiyaning parametriga massivni uzatmasdan uni global qilib qo’yish ham mumkin.
#include <iostream>
using namespace std;
int a[100];
int sumArray(int L, int R) {
int sum = 0;
for(int i = L; i <= R; i++) {
sum += a[i];
}
return sum;
}
int main() {
int n;
cin>>n;
for (int i = 0; i < n; i++)
cin>>a[i];
cout<<sumArray(0, 3)<<" "<<sumArray(3, 4);
}
Bir xil nomli funksiyalar.
C++ dasturlash tilida bir xil nomli funksiyalarni ishlatish mumkin. Ikkita bir xil nomli
funksiya ularning parametrlarining ro’yxati bilan farq qilishi lozim. Qaytaradigan
tiplari bilan farq qiladigan bir xil ro’yxatli funksiyalar yaratish mumkin emas.
int sumArray(int a[], int L, int R) {
int sum = 0;
for (int i = L; i <= R; i++) {
sum += a[i];
}
return sum;
}
double sumArray(double a[], int L, int R) {
double sum = 0;
for (int i = L; i <= R; i++) {
sum += a[i];
}
return sum;
}
Funksiyalar har xil funksiyalar. Ular massivning massivning tipi bilan farq
qilib turibdi.
Bunday ko’rinishda yaratish mumkin emas:
int sumArray(int a[], int L, int R) {
}
double sumArray(int a[], int L, int R) {
}
TOPSHIRIQLAR.
1. Berilgan sonning raqamli ildizini topuvchi funksiyani mustaql
yozing.
2. 1-topshiriqni bajargach quyidagi ifodaning raqamli ildizini
topuvchi dastru tuzing:
S= A[1]+A[1]*A[2]+A[1]*A[2]*A[3]+…+A[1]*A[2]*A[3]*…*A[n]
A[] bir o’lchamli massiv, o’qitib olinadi. Massiv elementlari qiymati 1
dan 1,000,000,000 gacha butun bo’lishi mumkin. Elementlar soni esa
1 dan 100 gacha bo’lishi mumkin.
3. Bir o’lchamli massiv berilgan. Massiv elementlari butun son va
[1..1,000,000,000] oraliqda bo’lishi mumkin elementlar soni esa 1000
dan oshmaydigan natural son. Funksiya yordamida massivning
[L..R] indekslari elementlari ko’paytmasini p(1≤p ≤1,000,000,000) ga
bo’lgandagi qoldiqni topuvchi dastur tuzing.
4. Bir o’lchamli massiv berilgan. Massiv elementlari soni 100,000
gacha bo’lishi mumkin. Elementlari qiymatlari esa [
-1,000,000,000…1,000,000,000]
intervalda
bo’lishi
mumkin.
Funksiyadan foydalanib shunday dastur tuzingki massivning [L..R]
indekslaridagi elementlar yig’indisini tezkor ravishda har bir
elementlarini qo’shib chiqmasdan topilsin.
5. Ikki o’lchamli massiv berilgan. Massiv elementlari satr va ustun
soni har biri 1000 gacha bo’lishi mumkin. Elementlari qiymatlari esa
[-1,000,000,000…1,000,000,000]
intervalda
bo’lishi
mumkin.
Funksiyadan foydalanib shunday dastur tuzingki ikki o’lchamli
massivning (x1<=i<=x2) va (y1<=j<=y2) shartni qanoatlantiruvchi
kataklaridagi sonlarning yig’indisi har bir elementlarini qo’shib
chiqmasdan topilsin.
REKURSIV FUNKSIYA.
O’z-o’ziga murojaat qiladigan funksiya rekursiv funksiya deb
ataladi. Rekursiv funksiyalardan agar funksiya parametrlari
bilan biror amal bajarib yandi parametrlar bilan huddi
shunday amal bajariladigan bo’lsa foydalanamiz. Bunday
masalalarni rekursiyasiz ham yechish mumkin. Lekin
rekursiya dastur tushinarliligini oshiradi va uni yozishni
osonlashtiradi.
Masala1.
Rekursiyadan foydalanib n! ning qiymatini hisoblovchi dastur
tuzing.
n! = n*(n-1)!.
10! = 1*2*3*4*5*6*7*8*9*10 = 9! * 10;
9! = 9*8!;
8! = 8*7!;
….
1! = 1*0!
0! = 1;
Masala2
Ikkita a va b sonlari berilgan ularning EKUBini topuvchi
dastur tuzing. EKUB inglizchada Greatest common divisor
qisqacha gcd(a, b).
Masalan gcd(25, 20) = 5; gcd(60, 70)=10.
Evklid.
Eramizdan oldingi 325 yilda tug’ilgan. Grek
matematigi, geometriyaning otasi. Evklid
algoritmi eng qadmgi algoritmlardan biri.
Evklid algoritmi bo’yicha:
gcd(a, b) =
a,
agar b=0
gcd(b, a % b), aks holda.
Masalan:
gcd(124, 36)
1)
a=124,b=36,b≠0. gcd(124,36)=gcd(36,124%36)=gcd(36, 16)
2)
a=36, b=16, b≠0. gcd(36, 16)=gcd(16, 36%16)=gcd(16, 4)
3)
a=16, b=4, b≠0. gcd(16, 4)=gcd(4, 16%4)=gcd(4, 0)
4)
a=4, b=0. gcd(4, 0) = 4;
Demak gcd(124, 36)=4.
Evklid algoritmining isboti.
a % b = a-
𝑎
𝑏
*b;
g = gcd(a, b) bo’lsa, g soni a va b ga bo’linadi.
U holda a % b ham g ga qoldiqsiz bo’linadi. Demak gcd(b, a %
b) g ga qoldiqsiz bo’linadi.
Bundan kelib chiqadiki a va b ning istalgan umumiy bo’luvchisi b
va a%b ning ham bo’luvchisi bo’ladi.
int gcd(int a, int b) {
if (b==0)
return a;
return gcd(b, a % b);
}
TOPSHIRIQLAR
1. Evklid algoritmini mustaql yozing.
2. Ikkita sonning EKUK ini (inglizcha “lcm”-least common
multiplier) topuvchi dastur tuzing.
3. Butun sonlardan iborat massiv berilgan. Massiv elementlari
qiymati [1..1,000,000,000] intervalda, massiv elementlari soni
1000 dan oshmaydi. Massiv elamentlarining EKUB ini
topuvchi dastur tuzing.
4. Butun sonlardan iborat massiv berilgan. Massiv elementlari
qiymati [1..1000] intervalda, massiv elementlari soni 100 dan
oshmaydi. Massiv elamentlarining EKUK ini topuvchi dastur
tuzing. Kiruvchi ma’lumotlar shunday beriladiki bunda EKUK
ning qiymati 9*1018 dan oshmasligi kafolatlanadi.
5. Bir o’lchamli massiv ko’rinishida sonlar berilgan. Massiv
elementlari [-1000…1000] oralida. Elementlari soni 24 dan
oshmaydi. Bu sonlar o’rtasida ‘+’ va ‘-’ amallarini shunday
qoyingki hosil bo’lgan ifodaning qiymati berilgan s soniga
teng bo’lsin.
Masalan: Massiv elementlari soni 5 ta. a[1]=10, a[2]=15,
a[3]=7, a[4]=6, a[5]=8 va s=0 bo’lsa u holda
Mumkin bo’lgan javoblardan bittasi: 10-15+7+6-8=0
Istalgan bitta variant topilsin.
E’tiboringiz uchun raxmat.
Savollar?