Даг LLOYD: Ако сте виделе видео на рекурзија,
целиот процес може да има се чинеше малку магично.
Како работи?
Како да функциите знаат дека тие треба да почекаме и да чека друга вредност
да се врати од различна функција јавете се со цел да се добие резултат што сакаме?
>> Добро, причината е поради тоа што се тоа функционира на нешто познато како магацинот на повикот.
Кога ќе се јавите на функција, систем издвојува простор во меморијата
за таа функција да ја врши својата работа.
И ние го нарекуваме овие делови од меморијата која се резервирани за секоја функција
јавете магацинот рамка или функција рамка.
И како што би очекувале, овие магацинот рамки
живеат на магацинот дел од меморијата.
>> Повеќе од една функција магацинот рамка може да постои во меморијата во дадено време.
Ако главната повикува функција потег, и потег повикува насока,
сите три функции има отворени рамки.
Но, тие не се сите немаат активна рамки.
Овие рамки се наредени во магацинот.
И рамката од повикале
функција е секогаш на врвот на магацинот.
А тоа е секогаш активната рамка.
Има само еден навистина некогаш функција која е активна во исто време.
Тоа е еден на врвот на магацинот.
>> Кога функциски повици на друг функција, тој вид на притиска пауза.
Тоа на некој начин е на чекање, чекање.
И уште магацинот рамка се турка врз оџакот на врвот на тоа.
И тоа станува активна рамка.
И рамката веднаш под него треба да се чека
додека таа е повторно на активната рамка пред да може да продолжи со својата работа.
Кога некоја функција е целосни и тоа е направено,
рамката се појави надвор од магацинот.
Тоа е терминологија.
И рамката веднаш под неа, како што штотуку го кажав,
станува новата активна рамка.
>> И ако таа го нарекува друга функција, тоа се случува да се откажеш повторно.
Магацинот рамка која нова функција волја да се турка кон врвот на магацинот.
Тоа ќе го стори нејзината работа.
Што би можеле да pop назад исклучување.
А другата функција под него може да продолжи повторно.
>> Па ајде да одиме преку ова, повторно, во потрага по идеја на факториел на
дека ние се дефинирани во рекурзија видео за да видите
точно како магија зад ова рекурзивен процес се случува.
Значи ова е целата наша датотека, нели?
Дефиниравме два functions-- главни и факт.
И како што би очекувале, било Ц програма ќе
за да започне во првата линија на главните.
>> Значи ние се создаде нов магацинот рамка за главни.
И тоа се случува да започне со трчање.
Главната повици printf.
Printf и ќе испечатите факториел од 5.
Па, тоа не знае она факториел од 5 е,
и така на овој повик е веќе во зависност од друг повик на функција.
Значи главната ќе паузира право таму.
Јас сум ќе ја напушти својата стрелка во право, таму, во боја
тоа со иста боја како на магацинот рамка на десната страна,
да се покаже дека главни се случува да се замрзне тука, додека факториел од 5 се нарекува.
>> Па факториел од 5 се нарекува.
И тоа се случува да се започне уште на самиот почнуваат на факториел на.
Тоа го поставува прашањето сум еднаков на 1?
Е 5 еднаков на 1?
Добро, не.
Па затоа се случува да одат надолу на друг дел, враќањето n пати
факториел од n 1 минус.
Па, ОК.
>> Па сега, факториел од 5 е во зависност од друг повик
да факториел, минувајќи во 4 како параметар.
И така факториел од 5 рамка, која црвена рамка,
се случува да се замрзне во право, таму во таа линија што сум наведено
и да чекаат за факториел од 4 до крај она што треба да направите, така што потоа
може да стане повторно активната рамка.
>> Па факториел од 4 започнува во На почетокот на факториел.
Е 4 еднаков на 1?
Не, па затоа се случува да го направи истото.
Тоа се случува да одат надолу по друго гранка.
Тоа се случува да се дојде до таа линија код.
Добро, јас ќе одам да се врати за четири пати.
Ох, факториел од 3-- така факториел 4 зависи факториел од 3 финишира.
>> И затоа таа треба да се јавите факториел од 3.
А што е ќе помине низ истиот процес повторно.
Таа започнува преку, добива тука.
Факториел од 3 зависи на факториел од 1.
Па факториел од 2 започнува, добива тука.
Тоа зависи од факториел од 1.
Факториел од 1 започнува.
>> ВО РЕД.
Па сега, ние сме добивање некаде интересно, нели?
Па сега, 1 е еднаков на 1.
И така се враќаме 1.
Во овој момент, ние се враќаме.
Функцијата е направено.
Тоа е однесување is-- има ништо друго, за тоа да се направи,
и така на магацинот рамка за факториел од 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.
Тоа е се чека да се печатење на таа вредност.
И тогаш тоа е направено.
Нема повеќе линии на код во главниот.
Така е главна рамка се појавува надвор магацинот, и сме подготвени.
>> И тоа е тоа како работи рекурзијата.
Тоа е како магацинот рамки работат.
Оние функциски повици што се случи претходно
се само на пауза, на чекање за следните повици
за да се заврши, па тие може да стане активен обликувате и стави крај на она што тие треба да се направи.
>> Јас сум Даг Лојд.
Ова е CS50.