Java - de ce recursiunea este atât de proastă în stivă de rufe în rusă

Nici unul dintre mijloacele de limbă nu poate fi rău sau bun prin definiție.

Recurgerea permite programatorului să-și exprime gândurile mai clar tuturor (și în primul rând compilatorului), dar prețul este înțelegerea a ceea ce se întâmplă. Este necesar să înțelegeți care este stack-ul așa cum este aranjat, care este pus pe stiva atunci când este chemat. Trebuie să aveți o imaginație puțin mai dezvoltată pentru a înțelege când se va opri recursiunea și ce se va întâmpla atunci când vă sunați. Este necesar să înțelegem de ce variabilele globale trebuie schimbate cu prudență și, în același timp, de ce ar trebui să existe cât mai puține variabile în funcție (până la reutilizare).







Cu toate acestea, orice algoritm recursiv poate fi scris fără recurs. (De obicei, folosind o matrice extensibilă dinamic)

Doar din recurență clasică - incapacitatea de a seta corect stiva folosind tastele de compilare (cât de des în Java, cum ar fi colectate de la linia de comandă, sau poate vă amintiți cum să înceapă un fir cu un stack mare).

Prin urmare, CV-ul (scuze pentru a fi nepoliticos), dacă vă pune această întrebare, atunci nu utilizați recursie dacă îți dai seama ce faci - atunci este un instrument foarte util crește lizibilitatea codului într-un număr de sarcini și de a da munca la compilator în loc de tine în termeni de optimizare.







A răspuns la 29 ianuarie la ora 16:57

Recurgerea nu este rea. Este nevoie doar de o atenție deosebită pentru stiva. Pe măsură ce crește cu fiecare pas, ceea ce conduce adesea la supraîncărcare.

Și, în principiu, poate fi înlocuită cu o iterație (ciclu). Ceea ce este de obicei recomandat să faceți în limbile în care nu există nicio recurență de coadă.

De exemplu, în scală, puteți specifica în mod explicit că ar trebui să existe o recursivitate utilizată cu ajutorul adnotării @tailrec. atunci apelul va fi înlocuit cu un apel.

Folosirea incorectă a recursului poate duce la supraîncărcarea stivei și la costuri imense de calcul. Cu toate acestea, abordarea recursiv are un avantaj semnificativ în algoritmul naturale: cu ajutorul mașinii de inducție matematice, puteți testa cu ușurință rezultatul este corect (ținând cont de particularitățile de reprezentare a datelor în memorie). Vă recomandăm pentru a marca procedura recursiv pentru a verifica adnotare @tailrec funcția de optimizare.

Pentru a optimiza metoda recursivă, se recurge, de obicei, la recursiunea cozii: un parametru suplimentar este stocat în funcția care stochează rezultatele calculului anterior. Totuși, în unele cazuri acest lucru nu este suficient: de exemplu, în același exemplu cu numerele Fibonacci: aici trebuie să stocați o listă de rezultate. Pentru a face acest lucru, puteți utiliza colecții lenești, în interiorul sau în afara metodei. Uneori există sarcini mai dificile, când, de exemplu, trebuie să găsiți lista optimă a rezultatelor. În acest caz, puteți utiliza recursul cu tăierea elementelor.

Postat pe 26 februarie, la 11:49







Articole similare

Trimiteți-le prietenilor: