Ero rekursion ja toiston välillä

Kirjoittaja: Laura McKinney
Luomispäivä: 1 Huhtikuu 2021
Päivityspäivä: 4 Saattaa 2024
Anonim
Ero rekursion ja toiston välillä - Tekniikka
Ero rekursion ja toiston välillä - Tekniikka

Sisältö


Rekursio ja iterointi suorittavat toistuvasti käskyjoukon. Rekursio on silloin, kun toiminnon lausunto kutsuu itseään toistuvasti. Toisto on silloin, kun silmukka toistuu, kunnes ohjausolosuhteista tulee väärä. Ensisijainen ero rekursion ja iteraation välillä on, että on rekursio on prosessi, jota käytetään aina funktioon. iteraatio sovelletaan ohjejoukkoon, jonka haluamme saada toistuvasti suorittamaan.

  1. Vertailutaulukko
  2. Määritelmä
  3. Keskeiset erot
  4. johtopäätös

Vertailutaulukko

Vertailun perusteetrekursioiteraatio
perustiedotLause funktion kappaleessa kutsuu itse toimintoa.Antaa käskyjoukon toistuvasti suorittaa.
MuotoRekursiivisessa funktiossa määritetään vain päättämisolosuhteet (perustapaus).Iteraatio sisältää alustuksen, ehdon, lausekkeen suorittamisen silmukassa ja päivityksen (lisäykset ja pienennykset) ohjausmuuttuja.
päättyminenEhdollisen lausekkeen sisältyy funktion runkoon, joka pakottaa toiminnon palaamaan ilman, että rekursiopuhelua suoritetaan.Iterointilausunto suoritetaan toistuvasti, kunnes tietty ehto saavutetaan.
KuntoJos funktio ei lähentyä joihinkin ehtoihin, joita kutsutaan (perustapaus), se johtaa äärettömään toistumiseen.Jos iterointikäskyn valvontaedellytys ei koskaan muutu vääriksi, se johtaa äärettömään iterointiin.
Ääretön toistoÄäretön rekursio voi kaataa järjestelmän.Ääretön silmukka käyttää CPU-jaksoja toistuvasti.
soveltavaRekursiota käytetään aina toimintoihin.Iteraatiota käytetään iterointilausekkeisiin tai "silmukoihin".
PinoPinoa käytetään tallentamaan joukko uusia paikallisia muuttujia ja parametreja aina, kun funktiota kutsutaan.Ei käytä pinoa.
yläpuolellaRekursio sisältää toistuvien toimintopuhelujen yläpuolella.Ei toistuvien toimintopuhelujen yläpuolella.
NopeusHidas toteutus.Nopea toteutus.
Koodin kokoRekursio pienentää koodin kokoa.Iterointi tekee koodista pidemmän.


Määritelmä Rekursio

C ++ sallii toiminnon kutsua itseään koodiinsa. Tämä tarkoittaa, että funktion määritelmällä on funktion kutsu itselleen. Joskus sitä kutsutaan myös “pyöreä määritelmä”. Funktion käyttämä paikallisten muuttujien ja parametrien joukko luodaan vasta joka kerta, kun toiminto kutsuu itseään, ja ne tallennetaan pinon yläosaan. Joka kerta kun toiminto kutsuu itseään, se ei kuitenkaan luo uutta kopiota toiminnosta. Rekursiivinen toiminto ei pienentä merkittävästi koodin kokoa eikä edes paranna muistin käyttöä, mutta tekee jonkin verran iteraatioon verrattuna.

Rekursion lopettamiseksi sinun on sisällytettävä valintailmoitus toiminnon määritelmään, joka pakottaa toiminnon palaamaan antamatta rekursiivista puhelua itselleen. Valitun lauseen puuttuminen rekursiivisen funktion määritelmästä antaa funktion äärettömässä rekursiossa, kun sitä kutsutaan.


Ymmärtäkäämme rekursion funktion avulla, joka palauttaa luvun tekijän.

int factorial (int num) {int vastaus; if (num == 1) {paluu 1; } else {vastaus = tekijä (num-1) * num; // rekursiivinen kutsu} paluu (vastaus); }

Yllä olevassa koodissa toisessa osassa oleva lause osoittaa rekursion, koska lause kutsuu funktiofaktoriaalista (), jossa se sijaitsee.

Määritelmä Iteraation

Iteraatio on prosessi, jolla suoritetaan käskyjoukko toistuvasti, kunnes iteraatiolausekkeen ehto tulee vääriksi. Iterointikäsky sisältää iteraatiolausekkeen sisältämien lauseiden alustamisen, vertailun, suorittamisen ja lopuksi ohjausmuuttujan päivityksen. Kun ohjausmuuttuja on päivitetty, sitä verrataan uudestaan ​​ja prosessi toistuu, kunnes iterointikäskyssä oleva lause osoittautuu vääriksi. Iterointilausekkeet ovat "for" -silmukalle, "while" -silmukalle, "do-while" -silmukalle.

Toistolauseke ei käytä pinoa muuttujien tallentamiseen. Siksi iteraation käsky suoritetaan nopeammin kuin rekursiivinen funktio. Jopa iterointitoiminnolla ei ole toistuvien toimintokutsujen yläpuolella, mikä myös nopeuttaa sen suorittamista kuin rekursiivinen toiminto. Iterointi lopetetaan, kun ohjausolosuhteet muuttuvat vääriksi. Ohjausolosuhteiden puuttuminen iteraatiolausunnossa voi johtaa äärettömään silmukkaan tai se voi aiheuttaa käännösvirheen.

Ymmärretään iteraatio yllä olevan esimerkin suhteen.

int factorial (int num) {int vastaus = 1; // tarvitsee alustamisen, koska se voi sisältää roskiarvon ennen sen alustamista (int t = 1; t> num; t ++) // iteraatio {vastaus = vastaus * (t); paluu (vastaus); }}

Yllä olevassa koodissa funktio palauttaa numeron tekijän iteraatiolauseketta käyttämällä.

  1. Rekursio on silloin, kun ohjelmassa oleva menetelmä soittaa toistuvasti, kun taas toisto tapahtuu, kun ohjelman ohjeet suoritetaan toistuvasti.
  2. Rekursiivinen menetelmä sisältää käskyjoukon, käskyn, joka kutsuu itsensä, ja lopetusolosuhteet, kun taas iterointilauseet sisältävät alustuksen, lisäyksen, ehdon, käskyjoukon silmukan sisällä ja ohjausmuuttujan.
  3. Ehdollinen lausunto päättää rekursion lopettamisen ja ohjausmuuttujan arvo päättää iteraation käskyn lopettamisen.
  4. Jos menetelmä ei johda lopetusolosuhteisiin, se siirtyy äärettömään rekursioon. Toisaalta, jos ohjausmuuttuja ei koskaan johda lopetusarvoon, iterointikäsky toistuu loputtomasti.
  5. Ääretön rekursio voi johtaa järjestelmän kaatumiseen, kun taas ääretön iterointi vie CPU-jaksot.
  6. Rekursiota sovelletaan aina menetelmään, kun taas iterointia sovelletaan ohjejoukkoon.
  7. Rekursion aikana luodut muuttujat tallennetaan pinoon, kun taas iterointi ei vaadi pinoa.
  8. Rekursio aiheuttaa toistuvien toimintokutsujen yläpuolella, kun taas iteraatiolla ei ole toimintoa kutsuvien toimintojen yläpuolella.
  9. Toiminnallisista kutsuista johtuen rekursion suorittaminen yläpuolella on hitaampaa, kun taas iteraation suorittaminen on nopeampaa.
  10. Rekursio pienentää koodin kokoa, kun taas iteraatiot tekevät koodista pidemmän.

johtopäätös:

Rekursiivinen toiminto on helppo kirjoittaa, mutta ne eivät toimi hyvin verrattuna iteraatioon, kun taas iteraatiota on vaikea kirjoittaa, mutta niiden suorituskyky on hyvä verrattuna rekursioon.