Vous êtes sur la page 1sur 50

ВИРТУАЛ ТЕХНОЛОГИЙН ТЭНХИМ,

Е-НЭЭЛТТЭЙ ИНСТИТУТ

Алгоритм ба програмчлал

Лекц - 6

www.emust.edu.mn
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Агуулга:

01 Алгоритмын үр нөлөө
01
02
02 Алгоритм

Давхар давталтууд

Рекурсын тухай ойлголт

03 Нэмэлт

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


www.emust.edu.mn
Алгоритмын үр нөлөө
Компьютеруудыг хязгааргүй хурдтай, санах ой нь үнэгүй байжээ гэж
үзье.
• Тэгвэл алгоритм судлах ямар нэг шалтгаан гарч ирэх үү?.
• Хэрэв таны шийдвэрийг үгүйсгэдэг, ингэхдээ зөв хариултыг чинь
үгүйсгэдэг бол ямар нэг шалтгаанаар түүнийгээ батлахыг хүсч
байгаа бол тийм боломж бий гэсэн үг.
Жишээлбэл. Хэрэв компьютерууд хязгааргүй хурдтай байсан бол
асуудлыг шийдвэрлэх дурын зөв арга бас байна. Та сайн программ
хангамжийн инженерийн практикт өөрийн бодлогыг шийдлийг
хэрэгжүүлэхдээ ашиглахыг хүсч магадгүй юм.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Алгоритмын үр нөлөө
Гэхдээ хэрэгжүүлэхэд хамгийн хялбар байх аливаа аргыг ихэнхдээ
ашиглана.

• Мэдээж хэрэг, компьютерууд хурдан байж болно. Гэхдээ тэд


хязгааргүй хурдтай гэсэн үг биш.
• Санах ой хямд байж болно. Гэхдээ үнэгүй биш.
• Тооцоолох хугацаа хязгааргүй байж болно. Гэхдээ хязгаарлагдмал
нөөцтэй санах ой байна.

Эдгээр нөөц баялагийг ухаалгаар ашиглах хэрэгтэй бөгөөд ингэхэд цаг


хугацаа болон орон зайн хувьд алгоритм үр ашигтай байх нь чухал.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Алгоритмын үр нөлөө
• Алгоритмууд нь ижилхэн асуудлыг шийдвэрлэхдээ гарах
үр ашгаасаа болж өөр хоорондоо их ялгаатай байдаг.
• Эдгээр ялгаанууд нь программ хангамж болон техник
хангамжаас шалтгаалсан ялгаануудаас илүү ач
холбогдолтой.

Жишээлбэл, Эрэмбэлэлт хийх 2 алгоритмыг харая !.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Алгоритмын үр нөлөө
Нэгдүгээрт, Оруулах эрэмбэлэлт гэж нэрлэгддэг, n зүйлсийг
эрэмбэлэхэд ойролцоогоор 𝑐1 n –тай тэнцэх цаг хугацааг зарцуулдаг
2

алгоритм байна. Энд 𝑐1 нь n-ээс хамаардаггүй тогтмол тоо байна.


Ингээд n2-тай ойролцоогоор пропорциональ хугацааг зарцуулна.

Хоёрдугаарт, Нэгтгэх эрэмбэлэлт, 𝑐2 n lg n –тай ойролцоогоор тэнцэх


хугацааг зарцуулдаг алгоритм байна. Энд lg n гэдэг нь l𝑜𝑔2 n–ийн
товчлол ба 𝑐2 гэдэг нь мөн n –с хамаардаггүй өөр нэг тогтмол тоо
болно. Энэ нь тэгэхлээр n lg n –тэй пропорциналь хугацааг зарцуулна.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Алгоритмын үр нөлөө
• Оруулах эрэмбэлэлт нь нэгтгэх эрэмбэлэлтээс бага тогтмол
коэффициенттэй байдаг тул тогтмолууд нь c1<c2 ийм байна.
Тогтмол коэффициентууд нь ажиллах хугацааны хувьд n хэмжээний
оролтын хамаарлаас хамаагүй бага ач холбогдолтой.

• Нэгтгэх эрэмбэлэлт нь өөрийн ажиллах хугацааны хувьд lgn–ийн


коэффициенттой байх бол оруулах эрэмбэлэлт нь түүнээс хамаагүй
их n-ийн коэффициенттой юм.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Алгоритмын үр нөлөө
• Жижиг хэмжээтэй оролтын хувьд оруулах эрэмбэлэлт нь нэгтгэх
эрэмбэлэлтийг бодвол ихэнхдээ хурдан байдаг хэдий ч оролтын
хэмжээ n нь хангалттай их болоод ирэхээр нэгтгэх эрэмбэлэлтийн lg
n-ийн давуу тал n-ийн эсрэг тогтмол коэффициентын ялгааны хувьд
илүү их болж ирнэ.
• c1 нь c2-ос бага байгаагаас үл хамааран нэгтгэх эрэмбэлэлт илүү
хурдан байх хөндлөн огтлолцолын цэг үргэлж байдаг.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Алгоритмын үр нөлөө
Илүү тодруулбал, Жишээлбэл илүү хурдтай компьютерээр (компьютер
A) оруулах эрэмбэлэлтийг гүйлгэж нөгөө талд нь илүү удаан
компьютерээр(компьютер Б) нэгтгэх эрэмбэлэлтийг гүйлгэж байна гэж
үзье.
• Эдгээр хоёрын аль алин нь нэг сая бөөн тоог эрэмбэлэх ёстой.
• Компьютер А-г секунд тутамд нэг тэрбум даалгаварыг биелүүлдэг,
• Харин компьютер Б-г секунд тутамд зөвхөн арван сая даалгаварыг
гүйцэтгэдэг гэж үзвэл тооцооллын хүчин чадлын хувьд компьютер А
нь компьютер Б-гээс 100 дахин их хурдтай байна.
Ялгааг илүү болгохын тулд компьютер А-д дэлхийн хамгийн уран
чадвартай программист оруулах эрэмбэлэлтийг машины хэл кодлодог
гэж үзье.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Алгоритмын үр нөлөө
Үр дүнд нь гарч байгаа код нь n тоог эрэмбэлэхэд 2𝑛2 ширхэг даалгавар
шаардана(энд 𝑐1 = 2 ).
Нөгөө талд нь нэгтгэх эрэмбэлэлтийг үр ашиггүй хөрвүүлэгчтэй дээд түвшний хэлээр
дундаж программист код бичиж үр дүнд нь гарч байгаа код нь 50nlgn даалгаварыг
биелүүлнэ гэсэн үг (иймд 𝑐2 = 50 ).

Нэг сая тоог эрэмбэлэхэд, компьютер A нь


2 ∙ (106 )2 даалгавар
= 2000 секунд
109 даалгавар/секунд
болно.
Харин компьютер Б нь
50 ∙ 106 𝑙𝑔 106 даалгавар
≈ 100 секунд
107 даалгавар/секунд
болно.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Алгоритмын үр нөлөө
Тааруухан хөрвүүлэгчтэй ч ажиллах хугацааг аажмаар удаашруулж буй
алгоритмыг ашигласнаар компьютер Б нь компьютер А-с 20 дахин илүү
хурдтай ажиллана.
• Нэгтгэх эрэмбэлэлтийн давуу тал биднийг арван сая тоог эрэмбэлэх
үед илүү харагддаг,
• Харин оруулах эрэмбэлэлт нь 2,3-н өдөр болж байхад нэгтгэх
эрэмбэлэлт нь 20-оос бага минут зарцуулдаг.

Ерөнхийдөө, бодлогын хэмжээ ихсэхэд, нэгтгэх эрэмбэлэлтийн


холбогдох давуу тал ч бас нэмэгдэж байдаг.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


ВИРТУАЛ ТЕХНОЛОГИЙН ТЭНХИМ,
Е-НЭЭЛТТЭЙ ИНСТИТУТ

Алгоритмын хэрэглээ : Давхар давталт

www.emust.edu.mn
Давхар давталт

• Дотроо нэг эсвэл хэд хэдэн давталт агуулсан давталтыг


давхар давталттай алгоритм гэнэ.
• Бусад давталтыг дотроо агуулсан давталтыг гадаад, өөр
давталтанд багтсан давталтыг дотоод давталт гэнэ.
• Тухайн давталтын параметрээс хамаарахгүй бүх
тооцоолон бодох үйлдлүүдийг заавал давталтын гадна
талд гүйцэтгэнэ.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Давхар давталт
Давхар давталтын алгоритмын үед баримтлах нэг дүрмийг
тодорхойльё.
• Энэ дүрэм нь ямар параметрээр гадаад давталтыг, ямараар
нь дотоод давталтыг зохиох вэ? Гэдгийг тодорхойлох ёстой.
• Бодлогын нөхцөлд ямар параметрийг гадаад, ямар
параметрийг дотоод давталтаар зохиохыг шууд зааж өгөөгүй
бол илүү олон бодолттой(олон удаа давтагдах) параметраар
гадаад давталтыг зохиох ёстой.
• Гадаад давталтын бие буюу үйлдлүүд нь дотоод давталтын
үйлдлүүдтэй харьцуулахад цөөн удаа биелэгддэг.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Давхар давталт

Гадаад давталтыг дараах нөхцөлтэй давталтаар хийх үед энэ


ялгаа харагдана. Жишээлбэл : x нь 1->20 y нь 1->50 хүртэл
давтах 2 давталт өгөгдсөн гэж үзвэл:
* 2 давталтын x-ыг гадаад давталт болговол x-ын утга 21
болсон үед y-ийг 50 удаа давтах тул дотоод давталт 1050
удаа биелэгдэнэ.
* y–ыг гадаад давталт болговол y-ын утга 51 болсон үед x-
ийг 20 удаа давтаж дотоод давталт 1020 удаа биелэгдэнэ.
* Иймээс илүү олон давтагдах y давталтыг гадаад давталт
болгоно.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Давхар давталт
Жишээ 1. n хүртэлх сондгой тооны
факториалуудын нийлбэрийг ол.

* i хувьсагчийг ашиглан 1-ээс n


хүртэлх сондгой тоог гаднах
давталтаар гаргаж авна.
* j хувьсагчид эхлээд 1 гэсэн утгыг
өгөөд доторх давталтыг ашиглан i
хүртэл (i-тэй тэнцүү) утгаар i тооны
факториалыг олж P-д өгнө.
* Олсон факториалыг S дээр нэмэх
үйлдлийг хийнэ.
* Гаднах давталт дуусмагц S-ийг
хэвлэнэ.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


#include <iostream>
using namespace std;

int main() {
int i, j, n;
double s, p;
i = 1;
s = 0;
p = 1;
j = 1;
cin >> n;
for (i = i; i <= n; i += 2) {
for (j = j; j <= i; j++) {
p = p * j;
cout << p << endl;
}
s = s + p;
}
cout <<"sum"<< s << endl;
return 0;
}
Жишээ 2. x өгөгдсөн бол
Z=1+2x/2!+4x/4!+6x/6! … 20x/20!
илэрхийллийн утгыг олох.

* Математик талаас авч үзвэл


илэрхийллийг хялбарчлан
1+∑ (2*i*x)/(2*i)! болгож
алгоритмыг зохиож болно.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


#include <iostream>
using namespace std;
int main() {
int i, j, n;
double p, x, z;

i = 1;
z = 1;
p = 1;
j = 1;
n = 10;
cin >> x;
for (i = i; i <= n; i++) {
for (j = j; j <= i; j++) {
p = p * j;
cout << z << endl;
}
z = (z + 2 * i * x) / p;
}
cout << "y=(z+2*i*x)/(2*i)= " << z << endl;
return 0; }
Жишээ 3. n бүхэл тоо өгөгджээ.
1-ээс n хүртэлх бүх тэгш
тоонуудыг өөрөөс нь 2 дахин
бага тоон зэрэгт дэвшүүлж
гарсан утгуудын нийлбэрийг ол.

* Гаднах давталтаар n-хүртэлх


тэгш тоонуудыг гарган авна.
* Доторх давталтаар тэгш
тооны i/2 зэргийг үржих үйлдэл
ашиглан олж байна.
* Энэ зэргүүдийн утгыг S
хувьсагч дээр нэмж нийлбэрийг
олж гаднах давталт дуусмагц
хэвлэнэ.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


#include <iostream>
using namespace std;
int main() {
int i, j, n, m;
double s, p;
i = 2; s = 0; j = 1;
cin >> n;
for (i = i; i <= n; i += 2) {
m = (double) i / 2;
p = i;
for (j = j; j <= m; j++) {
p = pow(p, m);
cout << p << endl;
}
s = s + p;
}
cout << "sum " << s << endl;
return 0; }
Жишээ 4. [50,1155] гэсэн завсарт орших
3-т хуваагддаг бүх тоонуудын цифрүүдийн
нийлбэрийг ол.

* Эхний дан давталтаар 50 гэсэн утгатай


n-ийг түүнээс их эхний 3-д хуваагдах тоо
хүртэл нэмэгдүүлнэ.
* Дараагийн буюу дотоод давталтанд
гаднах давталтын параметр i хувьсагчид
байгаа 3-д хуваагдах тооны цифрийн
нийлбэрийг олж байна.
* Ингэхдээ 10 хуваасан үлдэгдлийг авч
өмнөх давталтын j–ийн утгыг 10-д хувааж
j-д олгоно.
* i тоо ба цифрүүдийн нийлбэр S-ийг
хэвлэнэ. i нь 3,3-аар нэмэгдсээр 1155
хүртэл давтаж алгоритм төгсөнө.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


4. [50,1155] гэсэн завсарт орших 3-т хуваагддаг бүх тоонуудын цифрүүдийн
нийлбэрийг ол.

#include <iostream>
using namespace std;

int main() {
int n, m, i, j, s;

n = 50;
m = 1155;
s = 0;
i = n;
for (i = i ; i <= m ; i += 1) {
cout << i << endl;
if (i % 3 == 0) {
s = s + i;
}
}
cout << s << endl;
}
Жишээ 5. Өөрийнхөө
цифрүүдийн нийлбэрт
хуваагддаг бүх 3 оронтой тоог
хэвлэ.
* Ийм тоог сайн тоо гэж
нэрлэдэг.
* Гаднах давталтаар бүх 3
оронтой тоог гарган авна.
* Дотоод давталтаар i
хувьсагчид байгаа 3 оронтой
тооны цифрийн нийлбэрийг S
хувьсагчийг ашиглан олно.
* i тоо нь S цифрийн нийлбэрт
хуваагдаж байвал түүнийг
хэвлэнэ.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


#include <iostream>
using namespace std;
int main() {
int i, digit, j, s, d;

d = 0;
i = 100;
j = i;
s = 0;
for (i = 100 ; i <= 1000 ; i +=
1) {
for (j = 1 ; j <= j ; j += 1) {
digit = j % 10;
j = (int) ((double) j / 10);
s = s + digit;
if (i % s == 0) {
cout << i << endl;
}
}
}
}
Жишээ 6. Бүх 4 оронтой палиндром
тооны нийт тоог ол. Палиндром тоо нь
урд хойноос нь уншихад ижил утгатай
байдаг тоо юм.

* Гаднах давталтаар 4 оронтой бүх тоог


гаргана.
* Дотоод давталтаар 4 оронтой М
хувьсагчийн цифрүүдийг ялгаж digit(4)
хүснэгт массивт хадгална.
* Дотоод давталт дууссаны дараа эхний
ба сүүлийн цифрүүд, 2,3 дах цифрүүдийг
харьцуулж тэнцүү бол ийм палиндром
тооны тоог хадгалах pal_count
хувьсагчийг 1-ээр нэмэгдүүлнэ.
* Гаднах давталт дууссаны дараа
pal_count-ийн утгыг хэвлэнэ.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
#include <iostream>
using namespace std;
int main() {
int digit, reverse, n, num;

reverse = 0;
cin >> num;
n = num;
while (num != 0) {
digit = num % 10;
reverse = digit + reverse * 10;
num = (int) ((double) num / 10);
}
if (n == reverse) {
cout << "Палиндром тоо мөн байна"
<< endl;
} else {
cout << "Палиндром тоо биш байна"
<< endl;
}
}
ВИРТУАЛ ТЕХНОЛОГИЙН ТЭНХИМ,
Е-НЭЭЛТТЭЙ ИНСТИТУТ

Алгоритмын хэрэглээ: Рекурс

www.emust.edu.mn
01 Рекурсын тухай

01
02 Рекурсын шинж чанарууд
02
03 Рекурсын давуу болон сул тал

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


www.emust.edu.mn
Рекурсын тухай
Давталтаар өөрийгөө дууддаг функц, дэд програмыг рекурсив
ойлголтонд хамааруулна. Өөрөөр хэлбэл өөрийгөө дахин дуудах
процессыг рекурс гэнэ.

• Програмчлах үед хэрэглэгчийн функц нь шууд болон шууд бус аргаар


өөрөө өөрийгөө дуудах боломжтой байдаг.
• Рекурс функцд агуулагдаж байгаа команд буюу үйлдлүүд өөрийгөө
дуудаж ажиллуулдаг.
• Рекурсыг ямар нэг түвшин дэх үзэгдэл нь түүний өмнөх түвшний
үзэгдлээр тодорхойлогдох үйл явц гэж тодорхойлж болно.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Рекурсын тухай

• Рекурсыг ашигласнаар програмын кодчилолыг бага хэмжээтэй болгох,


мод, граф мэт шаталсан зохион байгуулалттай бүтцүүдтэй ажиллах
боломжийг бүрдүүлж өгдөг.
• Тодорхой асуудал, бодлогыг рекурсээр шийдэх эхний алхам нь
тэдгээрийн рекурсын шинж чанарыг томъёолох явдал юм.
• Рекурс давталт нь хамгийн бага оролтын утгуудын үргэлжлэх хугацаанд
фунцыг тодорхойлдог тэгшитгэл болон тэгшитгэл бус байна.
• Дэд бодлого бүр тодорхой үр дүнг гаргахын тулд өөрийн дэд бодлогоо
шийдэх ёстой.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Жишээлбэл : Бодит тоо X-ийг эерэг бүхэл тоо n зэрэгт дэвшүүлэх
үйлдлийг авч үзье.

xn ийн стандарт тодорхойлолт xn ийн стандарт тодорхойлолтыг


өгөгдсөн гэж үзвэл: гэж хялбарчлана:

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Энгийн програмчлалаар Рекурс функцаар илэрхийлбэл :
илэрхийлвэл :
double power(double x, int n)
double result = 1;
for (int j = 1; j <= n; j++) {
result *= x; if (n == 0)
return 1.0;
return x * power(x, n - 1);
}

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Рекурсийн шинж чанарууд

Рекурсив алгоритм нь алгоритмын бүх шинж чанарыг


агуулдаг байхын зэрэгцээгээр дараах онцлог шинж чанартай
байна.
1. Рекурсив томъёо эсвэл рекурсив үйлдлүүдийг агуулсан
байна.
2. Рекурсив үйлдэл нь эцэстээ үр дүн нь мэдэгдэж байгаа
энгийн тохиолдолд шилждэг байна.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Рекурс алгоритмын тодорхойлолтоос рекурсив алгоритмаар бодогдох
бодлого нь дараах шинж чанартай байна гэдгийг тогтоож болно.

1. Өгсөн бодлогыг түүнтэй ижил бөгөөд түүнээс хялбар бодлогуудаар


дэс дараалан задалж болдог.
2. Үр дүн буюу шийд нь мэдэгдэж байх эсвэл шууд бодож болох суурь
хялбар бодлого оршин байдаг.
3. Өгсөн бодлогыг хялбар бодлогуудаар дэс дараалан задлахад эцэстээ
суурь хялбар бодлого буюу төгсөх нөхцөлд хүрдэг.
4. Суурь бодлогын шийдийг ашиглан дээд түвшиний хялбар бодлогын
шийдийг олох гэх мэтээр буцаад анхны бодлогын шийдийг олж болдог.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Рекурсив алгоритм зохиох үйл ажиллагааг дараах ерөнхий
байдлаар томъёолж болох юм.

1. Өгсөн бодлогын рекурсив үйлдлийг агуулсан хялбар


бодлогуудад дэс дараалан задална.
2. Суурь хялбар бодлогын шийдийг олно.
3. Үндсэн ба рекурсив дэд алгоритмын хувьсагчид ба
параметрүүдийг тодорхойлно.
4. Үндсэн ба дэд алгоритмуудыг нарийвчлан зохионо.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Рекурс ашиглахын давуу болон сул тал

Рекурс ашиглахад олон сул, давуу тал тухайн программаас


шалтгаалан бий болох боломжтой. Гэхдээ маш товчхон
хэлбэл:

- Рекурс ашиглахын гол давуу тал нь богинохон код бичдэг


тул программ зохиогч бага ажил хийдэг.
- Том хэмжээний програмчлалын үед функцыг дуудах бүрт
санах ойн стейкт параметрүүд үүсгэх, их хугацаа зарцуулах
сул тал байдаг.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Рекурс дуудалт 1! = 1
2! = 1*2
Жишээ 1. Факториал. 3! = 1*2*3
long factorial(int n) …
{ 10! = 1*2*3*4*5*6*7*8*9*10
n! = 1*2*3*…*(n-1)*n
if (n == 0)
Тэгвэл дээрх факториалын томъёонд хувиргалт
return 1; хийвэл:
return n *factorial(n-1);
n!=1*2*3*…*(n-1)*n=n*(n-1)*…*3*2*1=n*(n-1)!
}
болно.

Эндээс харвал n-ийн факториал гэдэг бол (n-1)-ийн факториалийг n-ээр үржсэнтэй
тэнцэнэ. Иймд n-ийн факториалийг олохын тулд (n-1)-ийн факториалийг олох
шаардлагатай гэсэн үг.
Харин (n-1)-ийн факториалийг олохын тулд (n-2)-ийн факториалийг олох хэрэгтэй гэх
мэтчилэн үргэлжилнэ. Харин хамгийн эцсийн шатанд 1-ийн факториалийг олох буюу энэ
нь 1 байна.
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Рекурс дуудалт
Харин хамгийн эцсийн шатанд 1-ийн факториалийг олох бодлогын алхмуудыг
дараах хүснэгтээр харуулъя.

Бодлого Дэд бодлого


5! 5*4!
4! 4*3!
3! 3*2!
2! 2*1!
1! 1

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Рекурс дуудалт
Хамгийн сүүлийн алхамд бодлого энгийн болж, үр дүн гаргасан байна. Ингээд
бодолт эх бодлого руу шилжинэ.

Бодлого Үр дүн
1! 1
2! 2*1! = 2*1 = 2
3! 3*2! = 3*2 = 6
4! 4*3! = 4*6 = 24

5! 5*4! = 5*24 = 120

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Тайлбар:

• Рекурс функц өөрөө өөрийгөө дуудахдаа өмнөх утгаа


компьютерийн стек санах ойд хадгалж байдаг.
• Харин төгсгөх нөхцөлд хүрмэгцээ өмнөх санах ойд
хадгалсан утгуудаа дэс дараалан үржүүлж утгаа factorial
функцээр дамжуулан буцаана.

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Жишээ 2. Фибоначийн дараалал (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …)

Фибоначийн тоог олох рекурсийн Програмаар илэрхийлбэл:


томьеог бичвэл:
int Fibonacci(int n)
{
if (n == 1 || n == 2)
return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


ВИРТУАЛ ТЕХНОЛОГИЙН ТЭНХИМ,
Е-НЭЭЛТТЭЙ ИНСТИТУТ

Нэмэлт : C++ Рекурс жишээ


Жишээ. Рекурс ашиглаагүй. Рекурс ашигласан.
#include <iostream> #include<iostream>
using namespace std; using namespace std;
int main() int factorial(int n);
{ int main()
unsigned int n; { int n;
unsigned long long factorial = 1; cout << "Eyreg too oruul ";
cin >> n;
cout <<"Eyreg too oruul";
cout << "Factorial:" << n << " = " <<
cin >> n;
factorial(n);
for(int i = 1; i <=n; ++i) return 0; }
{ int factorial(int n)
factorial *= i; {
} if(n > 1)
cout << "Factorial" << n << " = " << factorial; return n * factorial(n - 1);
return 0; else
} return 1; }

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Рекурсийн ашигласан үр дүн
Дэд Дэд
Дуудагдсан функцэд функцээс
Эх функц
дэд функц өгөх буцах үр
аргумент дүн

main fact (1-р удаа) 5 5 * fact(4)

fact (1-р удаа) fact (2-р удаа) 4 4 * fact(3)

fact (2-р удаа) fact (3-р удаа) 3 3 * fact(2)

fact (3-р удаа) fact (4-р удаа) 2 2 * fact(1)

fact (4-р удаа) fact (5-р удаа) 1 1


Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ
Жишээ. Рекурс ашиглаагүй. Рекурс ашигласан.
#include <iostream> #include<iostream>
using namespace std; using namespace std;
int main() int add(int n);
{ int main()
int n, sum = 0; { int n;
cout << "Eyreg too oruul: ";
cout << "Eyreg too oruul "; cin >> n;
cin >> n; cout << "Niilber = " << add(n);
return 0;
for (int i = 1; i <= n; ++i) { }
sum += i; int add(int n)
} { if(n != 0)
cout << "Niilber ni= " << sum; return n + add(n - 1);
return 0; return 0;
} }

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Рекурс ашиглаагүй. Рекурс ашигласан.

Үр дүн нь: Үр дүн нь:

Eyreg too oruul 100000 Eyreg too oruul: 50


Niilber ni= 705082704 Niilber = 1275
-------------------------------- --------------------------------
Process exited after 2.654 Process exited after 3.402 seconds
seconds with return value 0 with return value 0
Press any key to continue . . . Press any key to continue . . .

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Жишээ. Рекурс ашиглаагүй. Рекурс ашигласан.
Хоёр тооны хамгийн их хуваагчийг олох.
#include <iostream>
#include <iostream>
using namespace std;
using namespace std;
int hcf(int n1, int n2);
int main()
int main()
{
{ int n1, n2;
int n1, n2;
cout << "Eyreg hoer too oruul ";
cout << " Eyreg hoer too oruul: ";
cin >> n1 >> n2;
cin >> n1 >> n2;
cout << "Hamgiin ih huvaagch: " << n1 << "
ba " << n2 << " ni " << hcf(n1, n2);
while(n1 != n2)
return 0; }
{ if(n1 > n2)
n1 -= n2;
int hcf(int n1, int n2)
else
{ if (n2 != 0)
n2 -= n1; }
return hcf(n2, n1 % n2);
cout << "Hamgiin ih huvaagch ni" << n1;
else
return 0; }
return n1; }

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ


Рекурс ашиглаагүй. Рекурс ашигласан.

Үр дүн нь: Үр дүн нь:

Eyreg hoer too oruul: 100 90 Eyreg hoer too oruul 100 65
Hamgiin ih huvaagch: 100 ba 65 ni 5
Hamgiin ih huvaagch ni 10 --------------------------------
-------------------------------- Process exited after 5.545 seconds with
Process exited after 2.556 return value 0
seconds with return value 0 Press any key to continue . . .
Press any key to continue . . . .

Виртуал Технологийн Тэнхим, Е-НЭЭЛТТЭЙ ИНСТИТУТ

Vous aimerez peut-être aussi

  • Lecture 12
    Lecture 12
    Document34 pages
    Lecture 12
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 9
    Lecture 9
    Document46 pages
    Lecture 9
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Programming Lec 6
    Programming Lec 6
    Document51 pages
    Programming Lec 6
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lec1-1 Corporate Activity Shine
    Lec1-1 Corporate Activity Shine
    Document61 pages
    Lec1-1 Corporate Activity Shine
    Amarsaikhan Tuvshinbayar
    0% (1)
  • Lecture 15
    Lecture 15
    Document40 pages
    Lecture 15
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 13
    Lecture 13
    Document46 pages
    Lecture 13
    Amarsaikhan Tuvshinbayar
    100% (2)
  • Lecture 11
    Lecture 11
    Document24 pages
    Lecture 11
    Amarsaikhan Tuvshinbayar
    100% (2)
  • Lecture 8 2018
    Lecture 8 2018
    Document54 pages
    Lecture 8 2018
    Amarsaikhan Tuvshinbayar
    100% (3)
  • Lecture 7 20108
    Lecture 7 20108
    Document47 pages
    Lecture 7 20108
    Amarsaikhan Tuvshinbayar
    75% (4)
  • Lecture - 10
    Lecture - 10
    Document35 pages
    Lecture - 10
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 3 2018
    Lecture 3 2018
    Document42 pages
    Lecture 3 2018
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 2
    Lecture 2
    Document80 pages
    Lecture 2
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 2 2018
    Lecture 2 2018
    Document33 pages
    Lecture 2 2018
    Amarsaikhan Tuvshinbayar
    100% (1)
  • Lecture 1 2018
    Lecture 1 2018
    Document39 pages
    Lecture 1 2018
    Amarsaikhan Tuvshinbayar
    100% (6)
  • IT101 Lecture 4
    IT101 Lecture 4
    Document72 pages
    IT101 Lecture 4
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 4 2018
    Lecture 4 2018
    Document47 pages
    Lecture 4 2018
    Amarsaikhan Tuvshinbayar
    100% (4)
  • Lecture 5 2018
    Lecture 5 2018
    Document54 pages
    Lecture 5 2018
    Amarsaikhan Tuvshinbayar
    100% (2)
  • Lecture 3
    Lecture 3
    Document72 pages
    Lecture 3
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Baikal Hotolbor
    Baikal Hotolbor
    Document2 pages
    Baikal Hotolbor
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Programming Lec 9
    Programming Lec 9
    Document39 pages
    Programming Lec 9
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Lecture 1
    Lecture 1
    Document54 pages
    Lecture 1
    Amarsaikhan Tuvshinbayar
    100% (2)
  • Lecture 3
    Lecture 3
    Document72 pages
    Lecture 3
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Programming Lec 7
    Programming Lec 7
    Document57 pages
    Programming Lec 7
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Programming Lec 8
    Programming Lec 8
    Document32 pages
    Programming Lec 8
    Amarsaikhan Tuvshinbayar
    100% (1)
  • Programming Lec 4
    Programming Lec 4
    Document39 pages
    Programming Lec 4
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Programming Lec 6
    Programming Lec 6
    Document51 pages
    Programming Lec 6
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • Koosen 2018 Algorithm Programming 1
    Koosen 2018 Algorithm Programming 1
    Document60 pages
    Koosen 2018 Algorithm Programming 1
    Amarsaikhan Tuvshinbayar
    100% (2)
  • Koosen 2018 Algorithm Programming 3
    Koosen 2018 Algorithm Programming 3
    Document46 pages
    Koosen 2018 Algorithm Programming 3
    Amarsaikhan Tuvshinbayar
    100% (1)
  • Koosen 2018 Algorithm 2
    Koosen 2018 Algorithm 2
    Document48 pages
    Koosen 2018 Algorithm 2
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation
  • PL - 3
    PL - 3
    Document47 pages
    PL - 3
    Amarsaikhan Tuvshinbayar
    Pas encore d'évaluation