Даг Ллоид: Ако сте видели видео на рекурзије,
цео процес можда има Изгледало је мало магичан.
Како то ради?
Како функције знају да су они треба да чекамо и чекамо другу вредност
да се врате из другог функције позвати како би добили резултат желимо?
>> Па, разлог је зато што ово ради нешто познат као Цалл Стацк.
Када позовете неку функцију, Систем издваја простор у меморији
за ту функцију да ради свој посао.
И зовемо ове делове меморије која се издвоји за сваку функцију
позовите оквир стек или функцију оквир.
И као што би се могло очекивати, ови стек оквири
живи на стека делу меморије.
>> Више од једне функције стек оквир може постојати у меморији у датом тренутку.
Ако главни позива функцију потез, и потез позива правац,
све три функције имају отворене оквире.
Али нису сви немају активне оквире.
Ови оквири су распоређени у гомили.
И оквир од недавно назвао
Функција је увек на врху гомиле.
И то је увек активан оквир.
Постоји само један заиста икада функција која је активна у исто време.
То је један на врху гомиле.
>> Када функција зове други функција, она врста притисне паузу.
То је некако је на чекању, чекајући.
И још стек оквир је гурнут на стек на врху.
И то постаје активан оквир.
И одмах рам испод тога треба да чека
док је то поново активна рам пре него што настави свој рад.
Када је функција потпуна и то је то,
њен оквир је пукла штос.
То је терминологија.
И одмах рам испод њега, као што сам рекао,
постаје нови активан оквир.
>> И ако се позива другу функцију, то ће опет паузу.
Стек оквир који ће нову функцију бити гурнут на врху гомиле.
То ће радити свој посао.
Можда поп одбиј.
А друга функција испод може да поново наставити.
>> Дакле, идемо кроз ово поново, тражи на идеји факторијел функција
који смо дефинисани у рецурсион видео да видите
тачно како је магија иза овога рекурзиван процес се одвија.
Дакле, ово је цела наша фајл, зар не?
Дефинисан смо два фунцтионс-- главни и чињеница.
И као што смо могли очекивати, било који Ц програм ће
да почне у првој линији главни.
>> Тако да смо креирали нову стек оквир за главни.
И то ће се покренути.
Главни позиви принтф.
И иф ће одштампате факторијел 5.
Па, то не зна шта факторијални од 5 је,
па овај позив је већ у зависности од другог позива функције.
Дакле, главни ће паузирати тамо.
Ја ћу оставити своје арров тамо, боју
то исте боје као стек оквир на десној страни,
да укаже да је главни ће се замрзнути овде док факторијални 5 зове.
>> Дакле, факторијални од 5 зове.
И то ће почети у самом почевши од факторијел функција.
То поставља питање ја износити до 1?
Је 5 једнако 1?
Pa ne.
Тако да ће отићи до елсе део, повратак н пута
факторијел од н минус 1.
Па, добро.
>> Тако сада, факторијални 5 је у зависности од други позив
да Фацториал, пролазећи у 4 као параметар.
И тако је факторијел од 5 оквир, који црвеним оквиром,
ће се замрзнути тамо у тој линији сам рекао
и чекати факторијелском 4 до заврши шта треба да уради да би затим га
може постати поново активне оквир.
>> Дакле, Факторијел од 4 почиње у почетак факторијални.
Да ли 4 једнако 1?
Не, тако да ће учинити исту ствар.
То ће ићи низ друго грану.
То ће доћи до тог линију кода.
У реду, ја ћу да се вратим четири пута.
О, факторијелском 3-- тако факторијелском 4 зависи факторијелском 3 дораде.
>> И тако треба да позове факторијел 3.
И то ће проћи поново исти процес.
Почиње кроз, стигне.
Факторијел од 3 зависи о факторијелском 1.
Дакле, факторијални од 2 покусаја, стигне.
То зависи од факторијелском 1.
Факторијел од 1 почиње.
>> ОК.
Дакле, сада, добијамо негдје занимљиво, зар не?
Дакле, сада, 1 је једнака 1.
И тако се враћамо 1.
У овом тренутку, ми се враћамо.
Функција је урадио.
То је понашање је- ту је ништа друго јер да уради,
па стек оквир за факторијални 1 попс искључен.
Готово је.
То се вратила 1.
А сада, факторијални 2, што одмах је оквир испод ње
у стеку, постаје активан оквир.
>> И то може покупити тачно тамо где је стао.
То је чекала на факторијелском од 1 до заврши свој посао.
Сада је то завршено.
И тако ево нас.
>> Факторијел 1 вратио има вредност 1.
Дакле, факторијални од 2 конзерве рецимо врати 2 пута 1.
Његов рад је сада учињено.
То је вратио 2 у Факториал 3, који је чекао.
Факторијел 3 је сада на врху оквир, активни оквир у стеку.
И тако се каже, ОК, ја идем да се врати 3 пута 2, што је 6.
И ја ћу дати да ценимо назад на факторијелском
4, који је чекао мене.
Завршио сам.
Факторијел 3 попс ван стек, и факторијални 4 је сада активан оквир.
>> 4 каже, у реду, ја ћу да се вратим 4 пута Подаци су обрађени 3, што је шест.
То је од вредности који факторијални од 3 вратили.
И тако 4 пута 6 је 24.
И ја ћу проћи да се врати Факториал
5, који је чекао мене.
Факторијел од 5 је сада активан оквир.
То ће да се врате 5 пута факторијелском 4-- 5 пута 24, или 120--
и да ту вредност назад на главни, који има
Чекали веома стрпљиво фор а дуго на дну гомиле.
>> То је место где је почело.
То је тај позив.
Неколико оквири преузео на врху.
Сада је поново на врху гомиле.
То је активна оквир.
Дакле, главни имам вредност 120 вратио из факторијелском 5.
То је чекала да одштампајте ту вредност.
И онда је готово.
Не постоји више је линија кода у главни.
Дакле, главни је оквир попс ван стек, и готови смо.
>> И тако рекурзија ради.
Тако стек оквири раде.
Та функција позива што се десило раније
су само на паузи, чекајући за наредне позиве
да заврши тако да могу да постану активни кадрирање и завршити оно што треба да урадите.
>> Ја сам Доуг Лојд.
Ово је ЦС50.