Mikä on rekursiivinen puhelu?

Ohjelmoinnissa rekursiivinen puhelu on komento aliohjelmassa tai funktiossa, joka kehottaa ohjelmaa suorittamaan saman aliohjelman uudelleen. Toistotoiminto voi olla toiminnon suora tulos, tai toinen toiminto voidaan laukaista, joka puolestaan ​​viittaa takaisin ensimmäiseen toimintoon. Rekursiivisessa puhelussa on joitain yhtäläisyyksiä pelätyn äärettömän silmukan kanssa, mutta aliohjelmassa on aina ehdollinen lauseke, joka kertoo ohjelmalle, milloin lopettaa rekursion toistaminen.

Rekursion käsitettä kuvataan ehkä parhaiten esimerkin avulla. Oletetaan, että katontekijä kiinnittää kotiin uusia vyöruusuja. Aluksi hänen on kuljetettava nippu vyöruusu katolle. Kun hän on nauhoittanut ensimmäisen nipun paikalleen, hänen on kiivettävä tikkaita alas, otettava toinen nippu ja naulattava se paikalleen. Prosessi jatkuu sarjassa “mene, hae, palaa”, kunnes viimeinen vyöruusu on asetettu. Siinä vaiheessa katontekijä voi vapaasti siirtyä seuraavaan työhön tai mennä kotiin.

Vaikka esimerkki on yksinkertaistettu, se sisältää kaikki rekursiivisen puhelun elementit. On olemassa lähtökohta, katontekijän on haettava tarvitsemansa, palattava alkuun ja lopetettava, kun lopullinen ehto täyttyy. Tämä on periaatteessa mitä ohjelma tekee; se alkaa, toteuttaa toiminnon, palaa itseensä ja päättyy, kun päättymisehto ilmenee.

Loppuehtoa kutsutaan perustapaukseksi. Se on välttämätöntä kaikille rekursiivisille puheluille; ilman sitä toiminto toistuisi. Parhaimmillaan tämä tyhjentää järjestelmän muistiresurssit. Normaalisti ylikuormitus kaataa ohjelman jossain vaiheessa, mutta siihen mennessä kun ongelma havaitaan, saattaa tapahtua merkittäviä vahinkoja.

Kokeneet ohjelmoijat saattavat tunnistaa samankaltaisuuden rekursiivisen puhelun ja “for” tai “while” -silmukan välillä. Jos esimerkiksi tavoitteena on löytää varaston kokonaismäärä kaikista osakkeista, joiden osanumerot ovat suurempia kuin 999, “for” -silmukka kehottaa ohjelmaa paikantamaan kaikki täyttävät esiintymät ja “while” -silmukka käskee ohjelman suorittamaan silmukan vain kun ilmoitettu ehto on voimassa. Rekursiivisen puhelun voidaan sanoa yhdistävän joitain näiden silmukoiden ominaisuuksia “jos-sitten-muut” -lausekkeeseen; jos tämä ehto on totta, tee tämä tai tee jotain muuta, jos ehto on epätosi. Rekursio mahdollistaa tyypillisesti kuitenkin pienemmän koodin ja sallii ongelman siirtämisen toiminnolle lähempänä sitä kohtaa, jota se tarvitsee.