Sissejuhatus rekursiivsesse funktsiooni C

Üksuste kordamise protsessi, nagu see oli varem, nimetatakse rekursiooniks. Funktsiooni peetakse rekursiivseks, kui seda kutsutakse iseenesest. Rekursiooni toetab programmeerimiskeel C. Allpool on toodud kaks tingimust, mis on C rekursiooni rakendamiseks kriitilised:

  • Väljumistingimus: see tingimus aitab funktsioonil tuvastada, millal sellest funktsioonist väljuda. Kui me ei täpsusta väljumistingimust, sisestatakse kood lõpmatusse ahelasse.
  • Loenduri muutmine : loenduri muutmine selle funktsiooni iga kõne korral.

Sel viisil saame C-programmeerimiskeeles rakendada rekursiivset funktsiooni. Need funktsioonid on kasulikud raha matemaatiliste probleemide lahendamisel, mis nõuavad sarnase protsessi mitu korda kutsumist. Selliste probleemide näideteks on paljude Fibonacci seeria põlvkondade faktoriaalide arvutamine.

Süntaks:

int fun(a1)
(
If(base_condition) return val;
fun(a2);
)

Kuidas rekursiivne funktsioon töötab C-s?

Rekursiivsed funktsioonid on viis võrrandi rakendamiseks C programmeerimiskeeles. Rekursiivne funktsioon kutsutakse argumendiga, milleks on n: n, virnas olev mälu eraldatakse nii kohalikele muutujatele kui ka funktsioonidele. Kõik funktsioonis olevad toimingud tehakse selle mälu abil. Väljumise tingimust kontrollitakse, kui see vastab. Kui kompilaator tuvastab kõne mõnele teisele funktsioonile, eraldab koheselt uus mälu virna ülaosale, kus luuakse samade lokaalsete muutujate ja funktsiooni erinev koopia. Sisestage sama protsess jätkub.

Kui põhitingimus naaseb tõeseks, antakse konkreetne väärtus helistamisfunktsioonile. Sellele funktsioonile eraldatud mälu tühjendatakse. samamoodi arvutatakse uus väärtus helistamisfunktsioonis ja IT naaseb superkõnefunktsiooni. Sel viisil tehakse funktsiooni kustutamise rekursiivseid kõnesid esimese funktsioonini ja kogu pinu mälu tühjendatakse ning väljund tagastatakse. Algtingimuse suurendamise või väljumise tingimusi funktsioonis ei täpsustata, siis võivad funktsiooni rekursiivsed kõned põhjustada lõpmatu ahela.

Rekursiivse funktsiooni näide

Nüüd vaatame C-s rekursiivse funktsiooni näiteid

Kood:

#include
int fun(int n)
(
if(n==1) return 1 ; //exit or base condition which gives an idea when to exit this loop.
return n*fun(n-1); //function is called with n-1 as it's argument .
//The value returned is multiplied with the argument passed in calling function.
)
int main()(
int test=4;
int result =0;
result =fun(test);
printf("%d", result);//prints the output result.
)

Väljund:

Eespool toodud koodi selgitus

Ülaltoodud näide on arvu faktoreali leidmine. Kui põhifunktsioon kutsub lõbutsema (4), siis kontrollitakse kõigepealt väljumistingimust (4 == 1), siis kutsutakse 4 * lõbusat (3). Jälle kontrollitakse põhitingimust (3 == 1). Samamoodi tagastatakse 3 * fun (2) kutsumine ja see jätkub kuni 2 * fun (1) kutsutakse ja kus see vastab põhitingimusele ja tagastab 1, siis helistamisfunktsioon naaseb 2 * 1, siis 3 * 2 * 1 ja esimesest kõnest naaseb 4 * 3 * 2 * 1. Nii salvestatakse põhifunktsioon 24 ja prinditakse see väljundisse.

Rekursiivse funktsiooni mälu jaotus

Iga c-keele funktsiooni kutsumine põhjustab mälu jaotamise virna ülaossa. Kui rekursiivset funktsiooni nimetatakse mäluks, eraldatakse see mälu ülaosas, mis on eraldatud helistamisfunktsioonile, iga funktsioonikõne jaoks luuakse kõik erinevad lokaalsete muutujate koopiad.
Milline on põhitingimus, kui funktsioonile eraldatud mälu hävib ja osuti naaseb helistamisfunktsiooni? seda protseduuri korratakse, siis esimene helistamisfunktsioon ja lõpuks saab virna mälu tühjaks.

Ülaltoodud näites on alloleva numbri faktoriaalide arvutamiseks mälu jaotamise stsenaarium.

Samm 1

2. samm

3. samm

Samm - 4

Samm - 5

Samm - 6

Samm - 7

Samm - 8

Samm - 9

Rekursiooni tüübid

C-programmeerimisel on kahte tüüpi rekursioone, mis on toodud allpool:

1. Saba ja sabata rekursioon

Ülalnimetatud rekursiooni tüüpi selgitatakse allpool:

  • Saba rekursioon

See on funktsiooni rekursiivse rekursiooni kõne tüüp, mis on viimane funktsioon, mida funktsiooni määratlemisel teha tuleb. Rekursiivne kõne toimub pärast funktsiooni loogika rakendamist.

Saba rekursiooni kasutamine meie programmis hansises programmi toimivuse vähendamiseks ja vähendab ka selle funktsiooni mälukasutust. Selle põhjuseks on asjaolu, et kui helistamise funktsioonile eraldatud mälu jaoks on rakendatud muud funktsiooni loogikat, saab selle virnast eemaldada ja uuesti kasutada.

Kood:

int fun1(n)(
printf(“the result is “);
return fun1(n-1);
)
void main()
(
fun1(4);
)

  • Sabata rekursioon

Seda tüüpi rekursiivne kollaaž, mis on tehtud funktsiooni määratluse keskel. Meeste pükste rekursioon on lõpule viidud ja helistamisfunktsioonile tagastatud väärtused tuleb veel täita, seega ei saa mälu kustutada.

Kood:

int fun1(n)(
printf(“the result is “);
return n* fun1(n-1);
)
void main()(
fun1(4);
)

2. Otsene ja kaudne rekursioon

Ülalnimetatud rekursiooni tüüpi selgitatakse allpool:

  • Kaudne rekursioon

Väidetavalt toimub kaudne rekursioon siis, kui konkreetset funktsiooni nimetatakse teise funktsiooni rekursiivsel keskkonnal.

Kood:

int fun1()(
fun2();
)
int fun2()(
fun1(); // calling the procedure recursively using another function.
)
void main()(
fun1();
)

  • Otsene rekursioon

Öeldakse, et otsene rekursioon toimub siis, kui funktsiooni rekursiivne kõne tehakse selle määratluse piires. ”

Kood:

int fun1()(
fun1();
)
void main()(
fun1();
)

Järeldus

Võib hõlpsalt järeldada, et rekursiivsed funktsioonid on kõige olulisemad selliste matemaatiliste probleemide lahendamisel, mis nõuavad sarnase meetodi rakendamist ja kogu loogika korduvat rakendamist, kuni väljumistingimus on täidetud. Paljud probleemid, näiteks Hanoi tornid, puude liikumine, graafikute sügavuse arvutamine.

Oluline on mainida rekursiivse funktsiooni põhitingimust. Rekursiivse programmi mälu- ja ajavajadus on iteratiivsetega võrreldes suurem, seetõttu tuleb neid ettevaatlikult kasutada.

Soovitatavad artiklid

See on juhend C-s esineva rekursiivse funktsiooni näite kohta. Siin käsitleme C-s töötamist, tüüpe, mälu jaotust ja näiteid C-rekursiivse funktsiooni kohta. Lisateabe saamiseks võite vaadata ka järgmisi artikleid -

  1. Massiivid C-programmeerimises
  2. C-programmi palindroom
  3. C-programmeerimise mustrid
  4. C vs C ++
  5. Palindroom JavaScriptis
  6. Fibonacci seeria juhend JavaScriptis

Kategooria: