Doug LLOYD: Jei mačiau dėl rekursijos vaizdo,
visas procesas gali turėti atrodė šiek tiek magiška.
Kaip tai veikia?
Kaip funkcijas žino, kad jie reikia laukti ir laukti kito vertę
grįžti iš skirtingos funkcijos skambinti norint gauti rezultatą mes norime?
>> Na, priežastis tai veikia, nes kažką, žinomą kaip skambučių kamino.
Kai skambinate funkciją, sistema panaikina vietos atmintyje
šiai funkcijai atlikti savo darbą.
Ir mes vadiname šiuos atminties gabaliukus, kad yra atidėta kiekvienos funkcijos
skambinti "stack frame" ar funkcija rėmo.
Ir kaip galima tikėtis, Šie kamino rėmeliai
gyvena ant kamino dalį atminties.
>> Daugiau nei viena funkcija "stack frame" gali egzistuoti atmintyje tam tikru laiku.
Jei pagrindinis vadina funkcija perkelti, ir judėti ragina kryptį,
visi trys funkcijos turi atvirus rėmai.
Bet jie ne visi turi aktyvių kadrų.
Šie rėmai yra išdėstyti kamino.
Ir nuo rėmo neseniai pavadino
funkcija yra visada ant kamino.
Ir kad yra visada aktyvus rėmas.
Yra tik tikrai kada nors viena funkcija tai aktyvus metu.
Tai vienas ant kamino.
>> Kai funkcija ragina kitas funkcija, tai tarsi spaudžia pauzę.
Tai tarsi yra sulaikytas, laukti.
Ir dar krūvą rėmas stumiamos ant ant jo kamino.
Ir tai tampa aktyvus rėmas.
Ir rėmas iš karto Toliau reikia laukti
tol, kol jis vėl yra aktyvi rėmas prieš tai gali tęsti savo darbą.
Kai funkcija yra išsami ir tai daroma,
jo rėmas yra popped nuo kamino.
Štai terminologija.
Ir rėmas iš karto po juo, kaip aš ką tik pasakė,
tampa nauja veiklioji rėmas.
>> Ir jei ji vadina kitą funkciją, jis ketina pristabdyti dar kartą.
Kad naujos funkcijos kamino kadras būti stumiama ant iš kamino viršuje.
Tai bus padaryti savo darbą.
Tai gali grįžti išjungtas.
Ir kitas funkcijas, toliau jis gali vėl ir vėl.
>> Taigi eikime per tai vėl ieško ties Faktorialaus funkcijos idėja
kad mes nustatoma pagal rekursija vaizdo pamatyti
tiksliai, kaip už tai magija rekursywny procesas vyksta.
Taigi tai yra visa mūsų failas, tiesa?
Mes nustatėme du functions-- pagrindinis ir faktas.
Ir kaip mes galima tikėtis, bet C programa vyksta
pradėti nuo pirmosios linijos pagrindinis.
>> Taigi, mes sukurti naują "stack frame" už pagrindinis.
Ir jis ketina pradėti veikti.
Pagrindinės skambučiai printf.
Ir printf ketina spausdinti faktorialas 5.
Na, jis nežino, kas faktorialas 5 yra,
todėl šis skambutis yra jau priklausomai nuo kito skambinimo funkcijos.
Taigi pagrindinis ketina pristabdyti teisę ten.
Aš gonna palikti savo rodyklė į dešinę ten, spalvą
ji tokios pat spalvos kaip kamino rėmo dešinėje,
nurodo, kad pagrindinis ketina įšaldyti čia, o faktorinė 5 vadinama.
>> Taigi faktorinė 5 vadinama.
Ir jis ketina pradėti labai pradžioje Faktorialaus funkcija.
Jis klausia aš lygus 1?
Yra 5, lygus 1?
Na, ne.
Taigi jis ketina eiti į else dalis, grąža n kartų
faktorialas n minus 1.
Na, gerai.
>> Taigi dabar, faktorinė 5 yra priklausomai kitą skambutį
į faktorialas, einančios in 4, kaip parametrą.
Ir taip faktorinės 5 rėmas, kad raudonu rėmeliu,
ketina įšaldyti teisę ten ne tos linijos aš nurodė,
ir laukti faktorialas 4 iki pabaigos ką jis turi daryti, kad tada ją
gali vėl tapo Aktyviojo rėmo.
>> Taigi faktorialas 4 prasideda faktorinės pradžia.
Yra 4, lygus 1?
Ne, todėl jis ketina padaryti tą patį.
Ji ketina eiti į kita filialas.
Ji ketina gauti iki to kodo eilutę.
Gerai, aš ruošiuosi grįžti keturis kartus.
Oi, faktorinė ir 3-- taip Faktorialas 4 priklauso nuo faktorialas 3 apdailai.
>> Ir todėl reikia skambinti faktorialas 3.
Ir tai viskas eiti per tas pats procesas dar kartą.
Jis prasideda per, gauna čia.
Faktorinė 3 priklauso nuo faktorialas 1.
Taigi faktorinė 2 paleidimų, gauna čia.
Tai priklauso nuo faktorialas 1.
Faktorinė iš 1 paleidimų.
>> GERAI.
Taigi dabar mes vis kokioje nors įdomioje vietoje, tiesa?
Taigi, dabar, 1 yra lygus 1,.
Ir taip mes grįžtame 1 d.
Šiuo metu, mes grįžtame.
Ši funkcija daroma.
Tai elgesys is-- ten nieko ji padaryti,
ir taip kamino rėmo faktorialas 1 pasirodo išjungtas.
Jis baigtas.
Jis grįžo 1 d.
Ir dabar, faktorinė 2, kuris buvo rėmas iš karto po juo
pluošte, tampa aktyvus rėmas.
>> Ir tai gali pasiimti tiksliai ten, kur jis nerašomas.
Tai buvo laukia faktorialas 1 baigti savo darbą.
Tai jau baigtas.
Ir todėl čia esame.
>> Faktorialinis iš 1 grąžintas 1 vertę.
Taigi faktorinė 2 skardinės tarkim grįžti 2 kartus 1 d.
Jo darbas yra dabar padaryta.
Jis grįžo nuo 2 iki faktorialas 3, kuris laukė jo.
Faktorinė 3 dabar viršutinio rėmo, aktyvus rėmas pluošte.
Ir taip ji sako, gerai, gerai, aš ruošiuosi grįžti 3 kartus 2, tai 6.
Ir aš norėčiau duoti, kad Vertiname atgal į faktorialas
4, kuris buvo manęs laukia.
Aš baigiau.
Faktorinė 3 pasirodo nuo kamino, o faktorialas 4 dabar aktyvus rėmas.
>> 4 sako, gerai, aš ruošiuosi grįžti 4 kartus 3 faktorialas, kuris buvo šeši.
Tai buvo verte, faktorialas 3 grąžinami.
Ir taip 4 kartus 6 yra 24.
Ir aš ruošiuosi perduoti kad atgal į faktorialas
iš 5, kuri buvo manęs laukia.
Faktorinė 5 dabar aktyvus rėmas.
Jis ketina sugrįžti 5 kartus faktorialas iš 4-- 5 kartus 24, ar 120--
ir duoti tą vertę atgal į pagrindinė, kuri turi
laukėme labai kantriai dėl ilgą laiką tuo kamino apačioje.
>> Tai kur jis pradėjo.
Jis padarė šį kvietimą.
Keletas kadrų perėmė viršuje.
Tai dabar atgal ant kamino.
Tai aktyvus rėmas.
Taigi pagrindinis gavo vertės 120 atgal nuo faktorialas 5.
Tai buvo laukia atsispausdinti šią vertę.
Ir tada tai daroma.
Nėra daugiau eilučių kodo Pagrindinėje.
Taigi pagrindinis rėmas pasirodo ne kamino, ir mes baigsite.
>> Ir tai, kaip rekursija veikia.
Štai kaip kamino rėmai dirbti.
Tos funkcija skambučiai tai atsitiko anksčiau
yra tik ant pauzės, laukia už paskesnių kvietimų
baigti, todėl jie gali tapti aktyvus apibrėžti ir baigti tai, ką jie turi daryti.
>> Aš Doug Lloyd.
Tai CS50.