Porovnávacia tabuľka
Základ pre porovnanie | rekurzia | opakovanie |
---|---|---|
základné | Vyhlásenie v funkcii funkcie volá samotnú funkciu. | Umožňuje opätovné vykonanie množiny inštrukcií. |
formát | Pri rekurzívnej funkcii je zadaná len podmienka ukončenia (základný prípad). | Iterácia zahŕňa inicializáciu, stav, vykonanie výkazu v smyčke a aktualizácia (prírastky a poklesy) riadiacej premennej. |
ukončenie | Podmienené vyhlásenie je zahrnuté v tele funkcie, aby sa funkcia vrátila bez vykonania rekurzívneho volania. | Opakovanie opakovania sa opakuje až do dosiahnutia určitej podmienky. |
podmienka | Ak sa funkcia nezhoduje s určitým stavom nazvaným (základný prípad), vedie k nekonečnej rekurzii. | Ak riadiaca podmienka v iterácii nie je nikdy falošná, vedie to k nekonečnej iteracii. |
Nekonečné opakovanie | Nekonečná rekurzia môže systém zničiť. | Nekonečná slučka opakovane používa cykly CPU. |
aplikovaný | Rekurzia sa vždy uplatňuje na funkcie. | Iterácia sa aplikuje na iterácie alebo "slučky". |
Stoh | Tento zásobník sa používa na uloženie množiny nových lokálnych premenných a parametrov pri každom vyvolaní funkcie. | Nepoužíva zásobník. |
horný | Rekurzia má réžiu opakovaných funkčných volaní. | Žiadna réžia opakovaného volania funkcie. |
rýchlosť | Pomalá realizácia. | Rýchla realizácia. |
Veľkosť kódu | Rekurzia znižuje veľkosť kódu. | Iterácia je kód dlhší. |
Definícia opakovania
C ++ umožňuje funkciu, ktorá sa volá vo svojom kóde. To znamená, že definícia funkcie má vlastnú funkciu. Niekedy sa to nazýva aj " kruhová definícia ". Súbor lokálnych premenných a parametrov použitých funkciou je novo vytvorený zakaždým, keď sa samotná funkcia volá a je uložená v hornej časti zásobníka. Ale vždy, keď sa niektorá funkcia volá, nevytvára novú kópiu tejto funkcie. Rekurzívna funkcia významne neznižuje veľkosť kódu a dokonca ani nevylepšuje využitie pamäte, ale v porovnaní s iteráciou to robí niektoré.
Ak chcete ukončiť rekurziu, musíte do definície funkcie zahrnúť výberové vyhlásenie, aby sa funkcia vrátila bez toho, aby ste jej povolili rekurzívny hovor. Neprítomnosť príkazu select v definícii rekurzívnej funkcie umožní funkcii v nekonečnej rekurzii, ktorá sa volá.
Chápeme rekurziu s funkciou, ktorá vráti faktoriál čísla.
int factorial (int num) {int odpoveď; ak (num == 1) {return 1; } inak {answer = faktorial (num-1) * num; // rekurzívne volanie} návrat (odpoveď); }
Vo vyššie uvedenom kóde sa v inej časti uvádza rekurzia, pretože výkaz volá funkciu faktorial (), v ktorom sa nachádza.
Definícia iterácie
Iterácia je proces vykonávania množiny inštrukcií opakovane, kým sa stav v iterácii vyhlásenie nestane falošným. Iteratívny výkaz obsahuje inicializáciu, porovnanie, vykonanie príkazov vo výkaze iterácie a nakoniec aktualizáciu riadiacej premennej. Po aktualizácii riadiacej premennej sa znova porovnáva a proces sa opakuje, kým sa podmienka v iterácii nezdarí. Iteratívne vyhlásenia sú "pre" slučku, "zatiaľ čo" slučka ", " do-while "slučka.
Príkaz iterácie nepoužíva zásobník na uloženie premenných. Preto je vykonanie výpovede iterácie rýchlejšie v porovnaní s rekurzívnou funkciou. Aj funkcia opakovania nemá riadiacu funkciu opakovaného volania funkcie, ktorá tiež robí jeho vykonanie rýchlejšie ako rekurzívna funkcia. Iterácia je ukončená, keď sa riadiaca podmienka stane nepravdivou. Absencia riadiacich podmienok v iterácii vyhlásenie môže mať za následok nekonečné slučky, alebo to môže spôsobiť chybu kompilácie.
Poďme chápať opakovanie vyššie uvedeného príkladu.
int faktorial (int num) {int odpoveď = 1; // vyžaduje inicializáciu, pretože môže obsahovať hodnotu odpadu pred jeho inicializáciou pre (int t = 1; t> num; t ++) // iteračné {answer = answer * (t); návrat (odpoveď); }}
Vo vyššie uvedenom kóde funkcia vráti faktoriál čísla pomocou iterácie.
Kľúčové rozdiely medzi rekurziou a iteraciou
- Rekurzia je, keď sa metóda v programe opakovane volá, zatiaľ čo opakovanie je, keď sa opakovane vykoná súbor pokynov v programe.
- Rekurzívna metóda obsahuje sadu inštrukcií, samotné výkazové volanie a koncovú podmienku, zatiaľ čo iteračné výkazy obsahujú inicializáciu, prírastok, stav, sadu inštrukcií v rámci slučky a riadiacu premennú.
- Podmienené vyhlásenie rozhodne, že hodnota ukončenia rekurzie a riadiacej veličiny sa rozhodnú pre ukončenie výkazu iterácie.
- Ak metóda nevedie k podmienkam ukončenia, vstupuje do nekonečnej rekurzie. Na druhej strane, ak riadiaca premenná nikdy nevedie ku koncovým hodnotám, iteračný príkaz sa nekonečne opakuje.
- Nekonečná rekurzia môže viesť k havárii systému, kým nekonečná iterácia spotrebuje cykly procesora.
- Rekurzia sa vždy uplatňuje na metódu, zatiaľ čo iterácia sa aplikuje na sadu inštrukcií.
- Premenné vytvorené počas rekurzie sú uložené na stohu, pričom iterácia nevyžaduje zásobník.
- Rekurzia spôsobuje réžiu opakovaných volaní funkcií, zatiaľ čo opakovanie nemá funkciu volania nad hlavou.
- V dôsledku funkcie volajúceho nad hlavou je vykonanie rekurzie pomalšie, zatiaľ čo vykonanie iterácie je rýchlejšie.
- Rekurzia znižuje veľkosť kódu, zatiaľ čo iterácie robia kód dlhší.
záver:
Rekurzívna funkcia je ľahko zapisovateľná, ale nepracujú dobre v porovnaní s iteráciou, zatiaľ čo opakovanie je ťažké písať, ale ich výkon je dobrý v porovnaní s rekurziou.