Цомпарисон Цхарт
Басис Фор Цомпарисон | Рекурзија | Итерација |
---|---|---|
Басиц | Изјава у телу функције позива саму функцију. | Омогућава да се скуп инструкција понавља. |
Формат | У рекурзивној функцији је специфициран само увјет завршетка (основни случај). | Итерација укључује иницијализацију, стање, извршење наредбе унутар петље и ажурирање (повећања и смањења) контролне варијабле. |
Прекид | Условна наредба је укључена у тело функције да би приморала функцију да се врати без извршења позива рекурзије. | Изјава о итерацији се опетовано извршава док се не достигне одређени услов. |
Стање | Ако функција не конвергира у неки услов који се зове (основни случај), то доводи до бесконачне рекурзије. | Ако контролни услов у изјави итерације никада не постане лажан, то доводи до бесконачне итерације. |
Инфините Репетитион | Бесконачна рекурзија може срушити систем. | Бесконачна петља више пута користи циклусе процесора. |
Апплиед | Рекурзија се увек примењује на функције. | Понављање се примењује на изјаве итерације или "петље". |
Стацк | Стацк се користи за складиштење скупа нових локалних варијабли и параметара сваки пут када се функција зове. | Не користи стацк. |
Оверхеад | Рекурзија поседује оптерећење поновљених позива функција. | Нема оптерећења поновљеног позива функције. |
Брзина | Споро у извршењу. | Брзо у извршењу. |
Величина кода | Рекурзија смањује величину кода. | Итерација чини код дужи. |
Дефиниција рекурзије
Ц ++ омогућава функцији да се назове унутар свог кода. То значи да дефиниција функције посједује функцијски позив на себе. Понекад се назива и „ кружна дефиниција “. Скуп локалних варијабли и параметара које користи функција су новостворени сваки пут када се функција позове и похрањују се на врху стог. Али, сваки пут када функција позове себе, она не ствара нову копију те функције. Рекурзивна функција не умањује значајно величину кода и не побољшава чак ни искоришћеност меморије, али чини нешто у поређењу са итерацијом.
Да бисте окончали рекурзију, морате укључити наредбу селецт у дефиницији функције да бисте присилили функцију да се врати без давања рекурзивног позива себи. Одсуство наредбе за селекцију у дефиницији рекурзивне функције омогућиће да се нека функција у бесконачној рекурзији једном позове.
Хајде да разумемо рекурзију са функцијом која ће вратити факторијале броја.
инт фацториал (инт нум) {инт ансвер; иф (нум == 1) {ретурн 1; } елсе {ансвер = фацториал (нум-1) * нум; // рецурсиве цаллинг} ретурн (ансвер); }
У горњем коду, израз ин елсе део показује рекурзију, јер израз позива функцију фацториал () у којој се налази.
Дефиниција итерације
Понављање је процес извршавања скупа инструкција више пута док се услов у изјави за итерацију не учини лажним. Изјава итерације укључује иницијализацију, поређење, извршавање наредби унутар изјаве о итерацији и коначно ажурирање контролне варијабле. Након што се контролна варијабла ажурира, она се поново упоређује, а процес се понавља, док се испостави да је услов у изјави итерације нетачан. Изјаве итерације су "фор" петље, "вхиле" петља, "до-вхиле" петља.
Изјава итерације не користи стог за спремање варијабли. Дакле, извршење наредбе итерације је брже у поређењу са рекурзивном функцијом. Чак и функција итерације нема оптерећење поновљеног позивања функција које такође чине његово извршавање бржим од рекурзивне функције. Итерација се завршава када контролни услов постане лажан. Одсуство контролних услова у наредби итерације може резултирати бесконачном петљом, или може изазвати грешку компилације.
Хајде да разумемо итерацију у односу на горњи пример.
инт фацториал (инт нум) {инт ансвер = 1; // треба иницијализацију јер може садржати смеће прије иницијализације за (инт т = 1; т> нум; т ++) // итерација {ансвер = ансвер * (т); повратак (одговор); }}
У горњем коду, функција враћа факторијале броја помоћу итерације.
Кључне разлике између рекурзије и понављања
- Рекурзија је када метод у програму опетовано позива себе, док је итерација када се скуп инструкција у програму више пута извршава.
- Рекурзивни метод садржи скуп инструкција, позивање самог израза и увјет престанка, док наредбе итерације садрже иницијализацију, инкремент, стање, скуп инструкција унутар петље и контролну варијаблу.
- Условна наредба одлучује о завршетку вриједности рекурзије и контролне варијабле одлучује о завршетку изјаве о итерацији.
- Ако метод не доводи до стања завршетка, он улази у бесконачну рекурзију. С друге стране, ако контролна варијабла никада не доведе до вриједности завршетка, израз итерације се понавља бесконачно.
- Бесконачна рекурзија може довести до пада система, док бесконачна итерација троши процесорске циклусе.
- Рекурзија се увек примењује на метод, док се итерација примењује на скуп инструкција.
- Варијабле креиране за вријеме рекурзије се похрањују на стог док итерација не захтијева стог.
- Рекурзија узрокује оптерећење поновљеног функцијског позива, док итерација нема функцију позивања главе.
- Због функције позива над главом извршење рекурзије је спорије док је извршење итерације брже.
- Рекурзија смањује величину кода, док итерације чине дужи код.
Закључак:
Рекурзивна функција се лако пише, али не функционише добро у поређењу са итерацијом, док је итерација тешко писати, али је њихов учинак добар у поређењу са рекурзијом.