Diagramă de comparație
Bazele de comparatie | Recursivitate | Repetare |
---|---|---|
De bază | Instrucțiunea într-un corp de funcții numește funcția însăși. | Permite ca setul de instrucțiuni să fie executat în mod repetat. |
Format | În funcția recursivă, este specificată numai condiția de terminare (cazul de bază). | Iterația include inițializarea, condiția, execuția instrucțiunii în buclă și actualizarea (incremente și decremente) a variabilei de control. |
terminare | O declarație condiționată este inclusă în corpul funcției pentru a forța funcția să se întoarcă fără a se executa apelul de recurs. | Instrucțiunea de repetare este executată în mod repetat până la atingerea unei anumite condiții. |
Condiție | Dacă funcția nu converge la o anumită stare numită (caz de bază), aceasta duce la o recursiune infinită. | Dacă condiția de control din declarația de iterație nu devine niciodată falsă, aceasta conduce la o iterație infinită. |
Repetarea Infinită | Reacția infinită poate să prăbușească sistemul. | Buclele infinite folosesc ciclurile CPU în mod repetat. |
Aplicat | Recurgerea este întotdeauna aplicată funcțiilor. | Iterația este aplicată declarațiilor de iterație sau "bucle". |
Grămadă | Stiva este folosită pentru a stoca setul de noi variabile și parametri locali de fiecare dată când este apelată funcția. | Nu folosește stivă. |
deasupra | Recurgerea posedă cheltuielile aferente apelurilor repetate. | Nu există cheltuieli generale legate de apelul repetat al funcției. |
Viteză | Slow în execuție. | Rapid în execuție. |
Dimensiunea codului | Recurgerea reduce dimensiunea codului. | Iterația face codul mai lung. |
Definiția Recursion
C ++ permite unei funcții să se sune în codul său. Aceasta înseamnă că definiția funcției posedă o chemare la funcția sa. Uneori se mai numește și " definiție circulară ". Setul de variabile și parametri locali utilizați de funcție este creat nou de fiecare dată când funcția se conectează și este stocată în partea de sus a stivei. Dar, de fiecare dată când o funcție se numește, ea nu creează o copie nouă a acelei funcții. Funcția recursivă nu reduce în mod semnificativ mărimea codului și nici nu îmbunătățește utilizarea memoriei, dar face unele în comparație cu iterația.
Pentru a termina recursiunea, trebuie să includeți o instrucțiune selectată în definiția funcției pentru a forța funcția să se întoarcă fără să dea un apel recursiv la sine. Absența instrucțiunii select în definirea unei funcții recursive va lăsa funcția în recursiune infinită o dată chemată.
Să înțelegem recursiunea cu o funcție care va returna factorialul numărului.
int factorial (int num) {int răspuns; dacă (num == 1) {return 1; } altceva {answer = factorial (num-1) * num; // apel recursiv} retur (răspuns); }
În codul de mai sus, instrucțiunea din altă parte arată recursiunea, deoarece instruciunea numește funcția factorial () în care se află.
Definiția Iteration
Iterația este un proces de executare a setului de instrucțiuni în mod repetat, până când condiția din declarația de iterație devine falsă. Instrucțiunea de iterație include inițierea, compararea, executarea instrucțiunilor din declarația de iterație și, în final, actualizarea variabilei de control. După ce variabila de control este actualizată, este comparată din nou, iar procesul se repetă, până când condiția din instrucțiunea de iterație se dovedește a fi falsă. Exemplele de iterație sunt "pentru" buclă ", în timp ce" buclă ", " faceți-în timp "buclă.
Instrucțiunea de iterație nu utilizează un teanc pentru stocarea variabilelor. Prin urmare, executarea instrucțiunii de repetare este mai rapidă în comparație cu funcția recursivă. Chiar și funcția de iterație nu are apelarea apelului repetat al funcțiilor, ceea ce face ca execuția sa să fie mai rapidă decât funcția recursivă. Repetarea este terminată atunci când condiția de control devine falsă. Lipsa condiției de control în declarația de iterație poate avea ca rezultat o buclă infinită sau poate provoca o eroare de compilare.
Să înțelegem iterația cu privire la exemplul de mai sus.
int factorial (int num) {int răspuns = 1; // are nevoie de inițializare deoarece poate conține o valoare de gunoi înainte de inițializare pentru (int t = 1; t> num; t ++) // iterație {answer = răspuns * (t); retur (răspuns); }}
În codul de mai sus, funcția returnează factorialul numărului utilizând instrucțiunea de iterare.
Diferențele cheie între recurs și iterare
- Recurgerea este atunci când o metodă dintr-un program se numește în mod repetat, în timp ce iterația este când un set de instrucțiuni într-un program este executat în mod repetat.
- O metodă recursivă conține un set de instrucțiuni, o chemare în declarație și o condiție de terminare, în timp ce instrucțiunile de iterație conțin inițializare, incrementare, condiție, set de instrucțiuni în cadrul unei buclă și o variabilă de control.
- O afirmație condiționată decide că rezilierea regresiei și valoarea variabilei de control determină terminarea instrucțiunii de iterație.
- Dacă metoda nu duce la condiția de terminare, ea intră în recursivitate infinită. Pe de altă parte, dacă variabila de control nu duce niciodată la valoarea de terminare, instrucțiunea de iterație se iterează infinit.
- Recurgerea infinită poate duce la un accident de sistem, în timp ce iterația infinită consumă cicluri CPU.
- Recursia este întotdeauna aplicată metodei în timp ce iterația este aplicată setului de instrucțiuni.
- Variabilele create în timpul recursului sunt stocate pe stivă, în timp ce iterația nu necesită o stivă.
- Recurgerea provoacă operațiunea de apelare repetată a funcțiilor, în timp ce iterația nu are o funcție de apelare deasupra capului.
- Datorită funcției de apelare, execuția de recuperare este mai lentă, în timp ce execuția iterației este mai rapidă.
- Recursia reduce dimensiunea codului, în timp ce iterațiile fac un cod mai lung.
Concluzie:
Funcția recursivă este ușor de scris, dar nu funcționează bine în comparație cu iterația, în timp ce iterația este greu de scris, dar performanța lor este bună în comparație cu recursul.