Ieteicams, 2020

Redaktora Izvēle

Atšķirība starp rekursiju un svārstībām

Rekursija un iterācija atkārtoti izpilda instrukciju kopumu. Rekursija ir tad, kad paziņojums kādā funkcijā sevi sauc atkārtoti. Iterācija ir tad, kad cilpa atkārtoti izpildās, līdz kontrolējošais nosacījums kļūst nepareizs. Galvenā atšķirība starp rekursiju un iterāciju ir tā, ka rekursija ir process, ko vienmēr izmanto funkcijai. Iterācija tiek pielietota instrukciju kopai, kuru mēs vēlamies atkārtoti izpildīt.

Salīdzinājuma diagramma

Salīdzinājuma pamatsRekursijaIterācija
PamataFunkcijas struktūrā izteiktais paziņojums sauc sevi par funkciju.Ļauj atkārtoti izpildīt instrukciju kopu.
FormātsRekursīvajā funkcijā ir norādīts tikai izbeigšanas nosacījums (bāzes gadījums).Iterācija ietver inicializāciju, nosacījumu, izraksta izpildi cilpā un atjaunina (mainās un samazina) kontroles mainīgo.
IzbeigšanaNosacījuma paziņojums ir iekļauts funkcijas ķermenī, lai piespiestu funkciju atgriezties bez rekursijas izsaukuma.Iterācijas paziņojums tiek atkārtoti izpildīts, līdz tiek sasniegts konkrēts nosacījums.
StāvoklisJa funkcija nesakrīt ar kādu no saucamajiem nosacījumiem (pamata gadījums), tas noved pie bezgalīgas rekursijas.Ja kontroles nosacījums iterācijas paziņojumā nekad nav kļuvis nepareizs, tas noved pie bezgalīgas iterācijas.
Bezgalīga atkārtošanāsBezgalīga rekursija var crash sistēmu.Bezgalīga cilpa atkārtoti izmanto CPU ciklus.
LietotsRekursija vienmēr tiek izmantota funkcijām.Iterācija tiek izmantota iterācijas paziņojumiem vai "cilpām".
KaudzeStack tiek izmantots jaunu vietējo mainīgo un parametru kopas saglabāšanai katru reizi, kad tiek izsaukta funkcija.Nelieto kaudze.
Pieskaitāmās izmaksasRekursijai piemīt atkārtotu funkciju zvanu pieskaitīšana.Nav atkārtotu funkciju zvanu.
ĀtrumsLēna izpilde.Ātra izpilde.
Kodeksa lielumsRekursija samazina koda lielumu.Iterācija padara kodu ilgāku.

Rekursijas definīcija

C ++ ļauj funkcijai sevi saukt savā kodā. Tas nozīmē, ka funkcijas definīcijai ir funkcija, kas tiek aicināta uz sevi. Dažreiz to sauc arī par „ apļveida definīciju ”. Vietējo mainīgo lielumu un parametru kopums, ko izmanto funkcija, tiek izveidots katru reizi, kad funkcija pati sevi izsauc un tiek glabāta kaudzes augšpusē. Bet katru reizi, kad funkcija pati sevi izsauc, tā nerada jaunas funkcijas kopiju. Rekursīvā funkcija būtiski nemazina koda lielumu un pat neuzlabo atmiņas izmantošanu, bet tā tiek veikta, salīdzinot ar iterāciju.

Lai pārtrauktu rekursiju, funkcijas definīcijā jāiekļauj atlases paziņojums, lai piespiestu funkciju atgriezties, nesniedzot rekursīvu aicinājumu sev. Izvēles paziņojuma trūkums rekursīvās funkcijas definīcijā ļaus funkcijai bezgalīgā rekursijā, kad to sauc.

Ļaujiet mums saprast rekursiju ar funkciju, kas atgriezīs skaitļa faktori.

 int faktori (int num) {int answer; ja (num == 1) {atgriezties 1; } cits {answer = faktori (num-1) * num; // rekursīvā zvana atgriešana (atbilde); } 

Iepriekš minētajā kodā paziņojums citā daļā parāda rekursiju, jo paziņojumā tiek izsaukts funkcijas faktors (), kurā tas atrodas.

Iterācijas definīcija

Iterācija ir instrukciju komplekta izpildes process, līdz nosacījums iterācijas paziņojumā kļūst nepareizs. Atkārtojuma paziņojumā ir ietverta inicializācija, salīdzināšana, paziņojumu izpilde iterācijas paziņojumā un visbeidzot kontroles mainīgā atjaunināšana. Pēc tam, kad kontroles mainīgais ir atjaunināts, to atkal salīdzina, un process atkārtojas, līdz stāvoklis iterācijas paziņojumā izrādās nepareizs. Iterācijas paziņojumi ir “par” cilpām, “cik”, cilpas “do-time”.

Izkārtojuma paziņojumā netiek izmantots kaudze, lai saglabātu mainīgos. Tādējādi iterācijas paziņojuma izpilde ir ātrāka, salīdzinot ar rekursīvo funkciju. Pat atkārtošanas funkcijai nav atkārtotas funkcijas izsaukuma, kas arī padara tās izpildi ātrāku par rekursīvo funkciju. Iterācija tiek pārtraukta, kad kontroles nosacījums kļūst nepareizs. Kontroles nosacījuma trūkums atkārtojuma paziņojumā var izraisīt bezgalīgu cilpu, vai tas var izraisīt kompilācijas kļūdu.

Saprotam iterāciju saistībā ar iepriekš minēto piemēru.

 int faktori (int num) {int answer = 1; // ir nepieciešama inicializācija, jo tā var saturēt atkritumu vērtību pirms tās inicializācijas (int t = 1; t> num; t ++) // iterācija {answer = atbilde * (t); atgriešanās (atbilde); }} 

Iepriekš minētajā kodā funkcija atgriež skaitļa faktori, izmantojot iterācijas paziņojumu.

Galvenās atšķirības starp rekursiju un iterāciju

  1. Rekursija ir tad, kad programmā iekļautā metode atkārtoti aicina sevi, bet iterācija ir tad, kad programmas instrukciju kopums tiek atkārtoti izpildīts.
  2. Rekursīvā metode satur instrukciju kopumu, paša izsaukumu un izbeigšanas nosacījumu, kamēr iterācijas paziņojumi satur inicializāciju, pieaugumu, stāvokli, instrukciju kopumu cilpā un kontroles mainīgo.
  3. Nosacījuma paziņojums nolemj rekursijas un kontroles mainīgā lieluma izbeigšanu izlemt iterācijas paziņojuma izbeigšanu.
  4. Ja metode neizraisa izbeigšanas nosacījumu, tā nonāk bezgalīgā rekursijā. No otras puses, ja kontroles mainīgais nekad nenoved pie izbeigšanas vērtības, iterācijas paziņojums iterē bezgalīgi.
  5. Bezgalīga rekursija var novest pie sistēmas crash, bet bezgalīgā iterācija patērē CPU ciklus.
  6. Rekursija vienmēr tiek izmantota metodei, bet iterācija tiek pielietota instrukciju kopai.
  7. Rekursijas laikā izveidotie mainīgie tiek saglabāti kaudze, bet iterācijai nav nepieciešama kaudze.
  8. Rekursija izraisa vairākkārtējas funkcijas izsaukuma pieskaitīšanu, bet iterācijai nav funkcijas, kas zvana virs galvas.
  9. Sakarā ar funkciju zvanu virsplūsmas rekursijas izpilde ir lēnāka, bet iterācijas izpilde ir ātrāka.
  10. Rekursija samazina koda lielumu, bet iterācijas padara kodu ilgāku.

Secinājums:

Rekursīvo funkciju ir viegli rakstīt, bet tie nav labi, salīdzinot ar iterāciju, bet iterāciju ir grūti rakstīt, bet to sniegums ir labs, salīdzinot ar rekursiju.

Top