Soovitatav, 2020

Toimetaja Valik

Rekursiooni ja iteratsiooni erinevus

Rekursioon ja iteratsioon täidavad korduvalt juhiseid. Rekursioon on siis, kui funktsiooni avaldus nimetab end korduvalt. Iteratsioon toimub siis, kui silmus kordub, kuni kontrolltingimus muutub valeks. Esmane erinevus rekursiooni ja iteratsiooni vahel on see, et rekursioon on protsess, mida alati kasutatakse funktsioonile. Iteratsiooni rakendatakse juhiste kogumile, mida me tahame korduvalt täita.

Võrdluskaart

Võrdluse alusRekursioonIteratsioon
PõhilineFunktsioonis sisalduv avaldus nimetab funktsiooni ise.Võimaldab juhiste kogumit korduvalt täita.
VormingRekursiivses funktsioonis on määratud ainult lõpetamistingimus (alusjuhtum).Iteratsioon hõlmab initsialiseerimist, seisukorda, avalduse täitmist silmusena ja kontrollimuutuja värskendamist (sammud ja vähendused).
LõpetamineFunktsiooni kehasse lisatakse tingimuslik avaldus, mis sunnib funktsiooni tagastama ilma rekursioonikõne käivitamiseta.Iteratsiooni avaldus täidetakse korduvalt, kuni on saavutatud teatud tingimus.
SeisundKui funktsioon ei lähene mõnele kutsutud olekule (alusjuhtum), viib see lõpmatu rekursioonini.Kui juhtimistingimus iteratsiooni avalduses ei muutu kunagi valeks, viib see lõputu iteratsioonini.
Lõpmatu kordusLõpmatu rekursioon võib süsteemi krahhida.Lõpmatu silmus kasutab korduvalt CPU tsükleid.
RakendatudRekursiooni rakendatakse alati funktsioonidele.Iteratsioon rakendatakse iteratsiooni avaldustele või "silmustele".
StackKorstnat kasutatakse uute kohalike muutujate ja parameetrite salvestamiseks iga kord, kui funktsiooni nimetatakse.Ei kasuta virna.
ÜldkuludRekursioonil on korduvate funktsioonikõnede üldkulud.Korduva funktsioonikõne üldkulud puuduvad.
KiirusTäitmine aeglane.Kiire täitmine.
Koodi suurusRekursioon vähendab koodi suurust.Iteratsioon muudab koodi pikemaks.

Rekursiooni määratlus

C ++ võimaldab funktsiooni ennast oma koodi piires nimetada. See tähendab, et funktsiooni määratlusel on funktsioon, mida kutsutakse iseendale. Mõnikord nimetatakse seda ka " ringkirjelduseks ". Funktsioonis kasutatavate kohalike muutujate ja parameetrite kogum luuakse iga kord, kui funktsioon ennast nimetab ja salvestatakse virna ülaosas. Kuid iga kord, kui funktsioon ennast nimetab, ei loo see selle funktsiooni uut koopiat. Rekursiivne funktsioon ei vähenda märkimisväärselt koodi suurust ega paranda isegi mälu kasutamist, kuid seda tehakse iteratsiooniga võrreldes.

Rekursiooni lõpetamiseks peate funktsiooni määratlusse lisama valikuavalduse, et sundida funktsiooni tagasi pöörduma ilma rekursiivse üleskutse andmata. Valikuavalduse puudumine rekursiivse funktsiooni määratluses võimaldab funktsiooni lõpmatu rekursiooni korral.

Mõistagem rekursiooni funktsiooniga, mis tagastab numbri faktori.

 int faktoriaal (int num) {int answer; kui (num == 1) {tagasi 1; } else {answer = faktori (num-1) * num; // rekursiivne helistamine} tagasi (vastus); } 

Ülaltoodud koodis näitab lause mujal osa rekursiooni, kuna avaldus kutsub funktsionaalfunktsiooni (), milles ta asub.

Iteratsiooni määratlus

Iteratsioon on juhiste komplekti korduv teostamine, kuni iteratsiooni avalduse tingimus muutub valeks. Iteratsiooni avaldus sisaldab iteratsiooni avaldusega seotud avalduste initsialiseerimist, võrdlemist, täitmist ja lõpuks muutuja kontrollimist. Pärast kontrollparameetri värskendamist võrreldakse seda uuesti ja protsess kordub, kuni iteratsiooni avalduse tingimus on vale. Iteratsiooni avaldused on "silmus", "silmus", "silmus".

Iteratsiooni avaldus ei kasuta muutujate talletamiseks virna. Seega on iteratsiooni avalduse täitmine rekursiivse funktsiooniga võrreldes kiirem. Isegi iteratsioonifunktsioonil ei ole korduvfunktsiooni üleskutset, mis muudab selle täitmise kiiremaks kui rekursiivne funktsioon. Iteratsioon lõpetatakse, kui kontrolltingimus muutub valeks. Kontrollitingimuste puudumine iteratsiooni avalduses võib tuua kaasa lõputu silmuse või võib tekitada kompileerimisvea.

Mõistame ülaltoodud näite puhul iteratsiooni.

 int faktoriaal (int num) {int answer = 1; // vajab initsialiseerimist, sest see võib sisaldada prügi väärtust enne selle initsialiseerimist (int t = 1; t> num; t ++) // iteratsiooni {answer = vastus * (t); tagasipöördumine (vastus); }} 

Ülaltoodud koodis tagastab funktsioon numbri faktori iteratsiooni avalduse abil.

Rekursiooni ja lteratsiooni vahelised peamised erinevused

  1. Rekursioon on siis, kui programmis meetod korduvalt nimetab ennast, samas kui iteratsioon on siis, kui programmi juhiste komplekt täidetakse korduvalt.
  2. Rekursiivne meetod sisaldab juhiste kogumit, ennast kutsuvat ennast ja lõpetamistingimust, samas kui iteratsiooni avaldused sisaldavad initsialiseerimist, juurdekasvu, seisundit, käskude komplekti silmus ja kontrolli muutuja.
  3. Tingimuslik avaldus otsustab rekursiooni lõpetamise ja kontrolli muutuja väärtuse otsustab iteratsiooni avalduse lõpetamise.
  4. Kui meetod ei vii lõpetamistingimuseni, siis siseneb see lõpmatu rekursioonini. Teisest küljest, kui juhtmuutuja ei vii kunagi lõpetamisväärtusele, iteratsioon iteratsioon lõputult.
  5. Lõpmatu rekursioon võib tuua kaasa süsteemi krahhi, samas kui lõpmatu iteratsioon tarbib CPU tsükleid.
  6. Rekursiooni rakendatakse alati meetodile, kusjuures iteratsiooni rakendatakse juhendite kogumile.
  7. Rekursiooni käigus loodud muutujad salvestatakse virnale, kuid iteratsioon ei nõua virna.
  8. Rekursioon põhjustab korduva funktsiooni üleskutse, samas kui iteratsioonil ei ole funktsiooni, mis kutsub üle üldkulusid.
  9. Funktsioonide tõttu on rekursiooni ülemine täitmine aeglasem, kuid iteratsiooni teostamine on kiirem.
  10. Rekursioon vähendab koodi suurust, samas kui iteratsioonid teevad koodi pikemaks.

Järeldus:

Rekursiivset funktsiooni on lihtne kirjutada, kuid nad ei toimi iteratsiooniga võrreldes hästi, samas kui iteratsiooni on raske kirjutada, kuid nende tulemuslikkus on rekursiooniga võrreldes hea.

Top