Razlika med rekurzijo in iteracijo

Avtor: Laura McKinney
Datum Ustvarjanja: 1 April 2021
Datum Posodobitve: 5 Maj 2024
Anonim
CS50 2014 - Week 6
Video.: CS50 2014 - Week 6

Vsebina


Rekurzija in iteracija večkrat izvedeta niz navodil. Rekurzija je takrat, ko se izjava v funkciji večkrat pokliče. Ponavljanje je, ko se zanka večkrat izvede, dokler pogoj nadzora ne postane napačen. Glavna razlika med rekurzijo in iteracijo je v tem, da je a rekurzija je postopek, ki se vedno uporablja za funkcijo. The iteracija se uporablja za niz navodil, ki jih želimo večkrat izvesti.

  1. Primerjalna tabela
  2. Opredelitev
  3. Ključne razlike
  4. Zaključek

Primerjalna tabela

Osnove za primerjavoRekurzijaIteracija
OsnovniStavek v telesu funkcije kliče funkcijo samo.Omogoča večkratno izvajanje nabora navodil.
OblikaV rekurzivni funkciji je naveden samo pogoj prekinitve (osnovni primer).Iteracija vključuje inicializacijo, stanje, izvedbo stavka v zanki in posodobitev (povečanja in zmanjšanja) kontrolne spremenljivke.
PrekinitevV telo funkcije je vključena pogojna izjava, da se funkcija vrne, ne da bi se izvedel rekurzijski klic.Izjava iteracije se večkrat izvaja, dokler ni dosežen določen pogoj.
PogojČe se funkcija ne konvergira v neko stanje, imenovano (osnovni primer), vodi v neskončno rekurzijo.Če pogoj nadzora v iteracijski stavki nikoli ne postane napačen, vodi v neskončno iteracijo.
Neskončna ponovitevNeskončna rekurzija lahko zruši sistem.Neskončna zanka večkrat uporablja cikle CPU-ja.
Uporablja seZa funkcije se vedno uporablja rekurzija.Iteracija se uporablja za iteracijske izjave ali "zanke".
ZložiteSklad se uporablja za shranjevanje nabora novih lokalnih spremenljivk in parametrov vsakič, ko se prikliče funkcija.Ne uporablja stack.
ZgorajRekurzija ima režijske stroške večkratnih funkcijskih klicev.Ni režijskih stroškov večkratnega klica funkcije.
HitrostPočasi pri izvajanju.Hitro v izvedbi.
Velikost kodeRekurzija zmanjša velikost kode.Iteracija kodo podaljša.


Opredelitev rekurzije

C ++ omogoča funkciji, da se pokliče znotraj svoje kode. To pomeni, da ima definicija funkcije klic funkcije k sebi. Včasih se imenuje tudi "krožna opredelitev". Nabor lokalnih spremenljivk in parametrov, ki jih uporablja funkcija, se na novo ustvari vsakič, ko se funkcija pokliče sama in je shranjena na vrhu zlaganja. Toda vsakič, ko se funkcija pokliče sama, ne ustvari nove kopije te funkcije. Rekurzivna funkcija bistveno ne zmanjša velikosti kode in sploh ne izboljša porabe pomnilnika, vendar jo v primerjavi z iteracijo naredi nekaj.

Če želite preklicati rekurzijo, morate v definicijo funkcije vključiti izbrani stavek, da se funkcija prisili v vrnitev, ne da bi samemu sebi dal rekurzivni poziv. Odsotnost izbirnega stavka v definiciji rekurzivne funkcije bo omogočila, da bo funkcija v neskončni rekurziji enkrat poklicana.

Razumejmo rekurzijo s funkcijo, ki bo vrnila faktor število.

int factorial (int num) {int odgovor; če (num == 1) {vrne 1; } else {answer = faktografski (število-1) * število; // rekurzivni klic} vrnitev (odgovor); }

V zgornji kodi stavek v drugem delu prikazuje rekurzijo, saj stavek imenuje funkcijo faktor (()), v kateri prebiva.


Opredelitev ponovitve

Iteracija je postopek večkratnega izvajanja niza navodil, dokler pogoj v iteracijski stavki ne postane napačen. Ponovni stavek vključuje inicializacijo, primerjavo, izvedbo stavkov znotraj iteracijske izjave in končno posodobitev kontrolne spremenljivke. Po posodobitvi kontrolne spremenljivke jo primerjamo znova in postopek se ponavlja, dokler se stanje v stavki iteracije ne izkaže za napačno. Izjave iteracije so zanka "for", zanka "while", zanka "do-while".

Stavek iteracije ne uporablja zaloga za shranjevanje spremenljivk. Zato je izvedba iteracijskega stavka hitrejša v primerjavi s rekurzivno funkcijo. Tudi iteracijske funkcije nimajo režijskih stroškov ponavljajočih se klicev, zaradi česar je njegovo izvajanje hitrejše kot rekurzivna funkcija. Ponovitev se konča, ko pogoj nadzora postane napačen. Če v pogoju iteracije ni kontrolnega pogoja, lahko pride do neskončne zanke ali pa pride do napake pri sestavljanju.

Poglejmo ponovitev zgornjega primera.

int factorial (int število) {int odgovor = 1; // potrebuje inicializacijo, ker lahko vsebuje vrednost smeti pred inicializacijo za (int t = 1; t> num; t ++) // iteracija {answer = odgovor * (t); povratek (odgovor); }}

V zgornji kodi funkcija vrne faktor iz številke z uporabo iteracijskega stavka.

  1. Rekurzija je takrat, ko se metoda v programu večkrat sam prikliče, iteracija pa je, kadar se niz navodil v programu večkrat izvede.
  2. Rekurzivna metoda vsebuje niz navodil, sam klic izjave in pogoj prenehanja, medtem ko iteracijski stavki vsebujejo inicializacijo, prirast, stanje, niz navodil znotraj zanke in nadzorno spremenljivko.
  3. Pogojna izjava odloči o koncu zaključka rekurzije, vrednost spremenljivke krmiljenja pa odloči o koncu iteracijske izjave.
  4. Če metoda ne privede do prenehanja, začne neskončno rekurzijo. Po drugi strani, če krmilna spremenljivka nikoli ne privede do zaključne vrednosti, iteracijski stavek ponavlja neskončno.
  5. Neskončna rekurzija lahko privede do zrušenja sistema, medtem ko neskončna iteracija porabi cikle CPU-ja.
  6. Za metodo se vedno uporablja rekurzija, medtem ko se za niz pouka uporablja iteracija.
  7. Spremenljivke, ustvarjene med rekurzijo, se shranijo v sklad, medtem ko iteracija ne potrebuje sklada.
  8. Rekurzija povzroči režijsko ponavljajoče se klicanje funkcije, medtem ko iteracija nima funkcije, ki bi klicala režijsko.
  9. Zaradi funkcije klica nadzemno izvajanje rekurzije je počasnejše, medtem ko je izvedba iteracije hitrejša.
  10. Rekurzija zmanjša velikost kode, medtem ko iteracije poglobijo kodo.

Zaključek:

Rekurzivno funkcijo je enostavno napisati, vendar ne deluje dobro v primerjavi z iteracijo, medtem ko je iteracija težko zapisati, vendar je njihova uspešnost dobra v primerjavi s rekurzijo.