Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 5 / 15 Rekursija ~50 min
Teorija

Rekursija nepanaikina steko

Ketvirtoje pamokoje pastatei steką ir baigei ją pastaba: transit paiešką rašo cikliškai, su aiškia eile, o ne rekursija. Ši pamoka paaiškina kodėl.

Rekursija nepanaikina steko

Biblioteka su aplankais aplankuose — natūraliai rekursyvi struktūra:

  root
   ├── rokas
   │    ├── 90-ieji
   │    └── klasika
   └── džiazas
        └── bebopas

Kad suskaičiuotum visus įrašus, reikia nusileisti į kiekvieną aplanką ir grįžti ten, kur buvai. Kažkas turi atsiminti, kur grįžti.

Rekursijoje tas kažkas yra iškvietimų stekas (call stack) — ta pati struktūra, kurią pastatei praeitoje pamokoje, tik ją tvarko ne tu, o programos vykdymo aplinka. Kiekvienas WalkRecursive iškvietimas paguldo ant jo kadrą (frame): argumentus, vietinius kintamuosius ir adresą, į kurį grįžti.

Rekursija ne pašalina steką. Ji paslepia jį — ir atiduoda jo valdymą kitam.

Šioje pamokoje parašysi tą patį apėjimą du kartus: rekursyviai ir cikliškai su savo steku. Rezultatai bus identiški, nes tai tas pats algoritmas.

Kur tai svarbu

Jei stekas tavo, jį matai: gali paklausti, koks jo gylis, gali nustatyti ribą, gali jį išsaugoti ir tęsti vėliau.

Jei stekas paslėptas, nieko iš to negali. O kai jis baigiasi — programa ne grąžina klaidą, o miršta.

Trečiame žingsnyje pamatysi, kaip tiksliai.