DOUG LLOYD: Ef þú hefur séð vídeó á endurkvæmni, allt ferlið gæti hafa virtist svolítið töfrandi. Hvernig virkar það? Hvernig gera aðgerðir vita að þeir þurfa að bíða og bíða eftir öðrum verðmæti til að fara aftur frá mismunandi föllum hringja til að fá niðurstöðuna sem við viljum? Jæja, ástæðan þetta virkar er vegna eitthvað þekktur sem kalla stafla. Þegar þú hringja í aðgerð, sem Kerfið setur til hliðar pláss í minni fyrir að virka að gera vinnu sína. Og við köllum þessar klumpur af minni sem eru sett til hliðar fyrir hverja aðgerð kalla stafla ramma eða virka ramma. Og eins og þú might búast við, þessi stafla ramma lifa á stafla af hálfu minni. Meira en ein aðgerð stafla ramma getur verið í minni á hverjum tíma. Ef helstu kallar virka færa, og færa símtöl átt, Öll þrjú aðgerðir hafa opinn ramma. En þeir gera ekki hafa allir virk ramma. Þessir rammar eru raðað í stafla. Og ramma úr hringdir virka er alltaf ofan á stafla. Og það er alltaf virka rammanum. Það er bara virkilega alltaf einn fall sem er virkt í einu. Það er eitt ofan á stafla. Þegar virka símtöl annar virka, það þrýstir konar hlé. Það er tegund af bið, bið. Og annar stafla ramma er ýtt á stafla ofan á hana. Og að verður virkur ramma. Og ramma strax neðan það þarf að bíða þar til það er aftur virka rammanum áður en það getur haldið áfram starfi sínu. Þegar aðgerð er heill og það er gert, rammi hennar er smella af stafla. Það er hugtakanotkun. Og ramma strax undir það, eins og ég sagði bara, verður nýja virka rammanum. Og ef það kallar annar virka, það er að fara að gera hlé aftur. Stafla ramma sem nýtt hlutverk mun verið ýtt inn á efsta hluta stafla. Það mun gera starf sitt. Það gæti skjóta aftur burt. Og önnur virka neðan það getur haldið áfram aftur. Svo skulum við fara í gegnum þetta aftur, leita á hugmyndinni um þátta virka að við og skilgreint er í endurkvæmni video til að sjá nákvæmlega hvernig galdur á bak við þetta endurkvæma aðferð er að taka fram. Svo er þetta allt skrá okkar, ekki satt? Við skilgreiningu tvö functions-- helstu og staðreynd. Og eins og við mátti búast hvaða C program er að fara að byrja á fyrstu línu main. Svo við að búa til nýja stafla ramma fyrir helstu. Og það er að fara að byrja að keyra. Helstu símtöl printf. Og printf er að fara að prenta út aðfeldi 5. Jæja, það veit ekki hvað þáttatilraun af 5 er, og svo er þetta kalla nú þegar eftir öðru virka símtalinu. Svo helstu er að fara að gera hlé þarna. Ég ætla að fara þess arrow rétt þar, lit það í sama lit sem stafla ramma til hægri, að gefa til kynna að helstu er að fara að frysta hér en þáttatilraun af 5 er kallað. Svo þáttatilraun af 5 er kallað. Og það er að fara að byrja á mjög farin að þátta virka. Það spyr spurningu ég er jafn 1? Er 5 jöfn 1? Jæja, ekki. Svo það er að fara að fara niður í else hluti, aftur n sinnum þáttatilraun n mínus 1. Jæja, allt í lagi. Svo nú, þáttatilraun af 5 er eftir öðru símtali að þáttatilraun, liggur í 4 sem breytu. Og svo aðfeldi 5 ramma, sem rauðum ramma, er að fara að frysta þarna á þeirri línu sem ég hef ætlað og bíða eftir aðfeldi 4 að klára það sem það þarf að gera svo að þá er það getur orðið virka rammanum aftur. Svo þáttatilraun af 4 hefst á upphaf þáttatilraun. Er 4 jöfn 1? Nei, svo það er að fara að gera það sama. Það er að fara að fara niður annað útibú. Það er að fara að fá til að línu af kóða. OK, ég ætla að fara aftur fjórum sinnum. Oh, þáttatilraun af 3-- svo aðfeldi 4 veltur á Hrópmerkt 3. frágangi. Og svo það þarf að hringja aðfeldi 3. Og það er ađ fara í gegnum sama ferli aftur. Það byrjar með, fær hér. Factorial af 3 veltur á Hrópmerkt af 1. Svo þáttatilraun af 2 byrjar, fær hér. Það fer eftir Hrópmerkt af 1. Factorial af 1 hefst. OK. Svo nú erum við að fá einhvers staðar áhugavert, ekki satt? Svo nú, 1 er jafnt og 1. Og svo við aftur 1. Á þessum tímapunkti, við erum aftur. Fallið er gert. Það er hegðun is-- það er ekkert annað fyrir það að gera, og svo stafla ramma fyrir þáttatilraun af 1 birtist burt. Það er búið. Það skilaði 1. Og nú, þáttatilraun af 2, sem var ramma strax fyrir neðan það í stafla, verður virkur ramma. Og það getur tekið upp nákvæmlega hvar það var horfið. Það er verið að bíða eftir Hrópmerkt frá 1 til ljúka störfum. Það hefur nú lokið. Og svo hér erum við. Factorial af 1 aftur gildið 1. Svo þáttatilraun af 2 dós segjum aftur 2 sinnum 1. Starf hennar er nú lokið. Það er aftur 2 til þátta 3, sem var að bíða eftir henni. Factorial af 3 er nú efst ramma, virka rammanum í stafla. Og svo segir hún, OK, vel, ég ætla til að fara aftur 3 sinnum 2, sem er 6. Og ég ætla að gefa sem gildi aftur til Hrópmerkt af 4, sem hefur verið að bíða eftir mér. Ég er búinn. Factorial af 3 birtist af stafla, og þáttatilraun af 4 er nú virkur ramma. 4 segir, OK, ég ætla að fara aftur 4 sinnum þáttatilraun af 3, sem var sex ára. Það var af value að þáttatilraun af 3 aftur. Og svo 4 sinnum 6 er 24. Og ég ætla að fara sem aftur þátta 5, sem hefur verið að bíða eftir mér. Factorial af 5 er nú virk ramma. Það er að fara að fara aftur 5 sinnum þáttatilraun af 4-- 5 sinnum 24 eða 120-- og gefa það gildi Til baka á aðalsíðu, sem hefur verið að bíða mjög þolinmóður eftir a langan tíma neðst á stafla. Það er þar sem það byrjaði. Það gerði þetta símtal. Nokkrir rammar tók efst. Það er nú aftur ofan á stafla. Það er virka rammanum. Svo helstu fékk gildi 120 aftur frá Hrópmerkt 5. Það er verið að bíða eftir að prenta út þetta gildi. Og þá er það gert. Það er engin fleiri línur af kóða í main. Svo birtist rammi main er af stafla, og við erum að gera. Og það er hvernig endurkvæmni virkar. Það er hvernig stafla ramma vinna. Þeir virka símtöl sem gerðist áður eru bara á hlé, bíða fyrir síðari útboð að klára svo þeir geta orðið virkir ramma og klára það sem þeir þurfa að gera. Ég er Doug Lloyd. Þetta er CS50.