Rekursiooni ja iteratsiooni erinevus
Sisu
Rekursioon ja iteratsioon täidavad korduvalt juhiseid. Rekursioon on siis, kui funktsiooni avaldus kutsub ennast korduvalt. Iteratsioon toimub siis, kui silmus kordub, kuni kontrolltingimus muutub valeks. Esmane erinevus rekursiooni ja iteratsiooni vahel on see, et a rekursioon on protsess, mida rakendatakse alati funktsioonile. iteratsioon rakendatakse juhiste komplektile, mida soovime korduvalt täita.
- Võrdlusdiagramm
- Definitsioon
- Peamised erinevused
- Järeldus
Võrdlusdiagramm
Võrdluse alus | Rekursioon | Iteratsioon |
---|---|---|
Põhiline | Lause funktsiooni korpuses kutsub funktsiooni ise. | Võimaldab juhiste komplekti korduvalt täita. |
Vorming | Rekursiivse funktsiooni korral on määratud ainult lõpetamise tingimus (põhijuhtum). | Iteratsioon sisaldab initsialiseerimist, tingimust, avalduse täitmist ahelas ja juhtmuutuja värskendamist (suurendamine ja vähendamine). |
Lõpetamine | Funktsiooni põhiosa on lisatud tingimuslik avaldus, mis sunnib funktsiooni naasma ilma rekursioonikõnet tegemata. | Korratakse iteratsiooniavaldust, kuni teatud tingimus on saavutatud. |
Seisund | Kui funktsioon ei lähe kokku mõne tingimusega, mida nimetatakse (põhijuhtum), viib see lõpmatu rekursioonini. | Kui iteratsiooniavalduses esitatud kontrollitingimus ei muutu kunagi valeks, viib see lõpmatu iteratsioonini. |
Lõpmatu kordus | Lõpmatu rekursioon võib süsteemi krahhi põhjustada. | Lõpmatu ahel kasutab korduvalt protsessori tsükleid. |
Rakendatud | Rekursiooni rakendatakse alati funktsioonidele. | Iteratsiooni rakendatakse iteratsiooniavaldustele või "silmustele". |
Korstnat | Pinu kasutatakse uute kohalike muutujate ja parameetrite komplekti salvestamiseks iga kord, kui funktsiooni kutsutakse. | Ei kasuta virna. |
Üle pea | Rekursioon hõlmab korduvate funktsioonikõnede üldkulusid. | Korduvate funktsioonide väljakutse puudub. |
Kiirus | Aeglane täitmine. | Kiire täitmine. |
Koodi suurus | Rekursioon vähendab koodi suurust. | Itereerimine muudab koodi pikemaks. |
Rekursiooni mõiste
C ++ võimaldab funktsioonil helistada enda koodi piires. See tähendab, et funktsiooni määratlus omab funktsiooni kutset iseendale. Mõnikord nimetatakse seda ka “ümmargune määratlus“. Funktsiooni kasutatavate kohalike muutujate ja parameetrite komplekt luuakse iga kord, kui funktsioon ise helistab, ja need salvestatakse virna ülaossa. Kuid iga kord, kui funktsioon ise helistab, ei loo see funktsioonist uut koopiat. Rekursiivne funktsioon ei vähenda koodi mahtu märkimisväärselt ega paranda isegi mälu kasutamist, kuid iteratsiooniga võrreldes teeb seda mõnevõrra.
Rekursiooni lõpetamiseks peate funktsiooni määratlusesse lisama valimislause, mis sunnib funktsiooni naasma, ilma et ta ise rekursiivset kõnet annaks. Valitud väite puudumine rekursiivse funktsiooni määratluses laseb funktsioonil kord helistada lõpmatu rekursiooni korral.
Mõistagem rekursiooni funktsiooniga, mis tagastab arvu faktori.
int faktoriaal (int num) {int vastus; if (num == 1) {tagasta 1; } else {vastus = faktoriaal (num-1) * num; // rekursiivne helistamine} tagasitulek (vastus); }
Ülaltoodud koodis näitab lause teises osas rekursiooni, kuna avaldus kutsub funktsiooni factorial (), milles see asub.
Iteratsiooni määratlus
Itereerimine on käskude komplekti korduv täitmine, kuni iteratsiooniavalduses esitatud tingimus muutub valeks. Iteratsiooniavaldus sisaldab iteratsiooniavalduses olevate avalduste initsialiseerimist, võrdlemist, täitmist ja lõpuks juhtmuutuja värskendamist. Pärast kontrollmuutuja värskendamist võrreldakse seda uuesti ja protsess kordub, kuni iteratsiooniavalduses esitatud tingimus osutub valeks. Iteratsioonilaused on „jaoks”, „samas”, „ja”, „tegemata”.
Iteratsiooniavalduses ei kasutata muutujate salvestamiseks pinu. Seega on iteratsiooniavalduse täitmine kiirem kui rekursiivne funktsioon. Isegi iteratsioonifunktsioonil puudub korduvate funktsioonide helistamine, mis muudab selle täitmise kiiremaks kui rekursiivne funktsioon. Iteratsioon lõpetatakse, kui kontrollitingimus muutub valeks. Juhtimistingimuste puudumine iteratsioonilauses võib põhjustada lõpmatu ahela või põhjustada kompileerimisvea.
Saame aru iteratsioonist ülaltoodud näite osas.
int faktoriaal (int num) {int vastus = 1; // vajab lähtestamist, kuna see võib sisaldada prügi väärtust enne selle lähtestamist (int t = 1; t> num; t ++) // iteratsioon {answer = answer * (t); tagasi (vastus); }}
Ülaltoodud koodi korral tagastab funktsioon numbri faktoriaal iteratsiooniavalduse abil.
- Rekursioon on see, kui mõni meetod programmis kutsub ennast korduvalt, iteratsioon on see, kui programmi juhiseid komplekti korduvalt täidetakse.
- Rekursiivne meetod sisaldab käskude komplekti, väljakutse iseennast ja lõpetamistingimusi, samas kui iteratsiooniavaldused sisaldavad initsialiseerimist, juurdekasvu, tingimust, käsu komplekti ahelas ja juhtmuutujat.
- Tingimuslik avaldus otsustab rekursiooni lõpetamise ja kontrollmuutuja väärtus otsustab iteratsiooniavalduse lõpetamise.
- Kui meetod ei vii lõpetamise tingimuse juurde, läheb see lõpmatu rekursioonini. Teisest küljest, kui juhtmuutuja ei vii kunagi lõppväärtuseni, itereerub iteratsiooniavaldus lõpmata.
- Lõpmatu rekursioon võib põhjustada süsteemi krahhi, samas kui lõpmatu iteratsioon kulutab protsessori tsükleid.
- Rekursiooni rakendatakse alati meetodile, iteratsiooni aga juhiste komplektile.
- Rekursiooni ajal loodud muutujad salvestatakse pinu, iteratsioon ei vaja pinu.
- Rekursioon põhjustab korduvate funktsioonide väljakutsumise üldkulusid, samas kui iteratsioonil puudub funktsioon, mis kutsub üles pea.
- Funktsioonikõnede tõttu on rekursiooni üldine täitmine aeglasem, samas kui iteratsiooni teostamine on kiirem.
- Rekursioon vähendab koodi mahtu, iteratsioonid muudavad koodi pikemaks.
Järeldus:
Rekursiivset funktsiooni on lihtne kirjutada, kuid need ei toimi iteratsiooniga võrreldes hästi, iteratsiooni on aga raske kirjutada, kuid nende rekursiooniga võrreldes on see hea.