DOUG LLOYD: Ha láttad A videó rekurzív,
Az egész folyamat lehet, tűnt egy kicsit varázslatos.
Hogyan működik?
Hogyan funkciókat tudja, hogy meg kell várni, és várni egy másik érték
hogy visszatérjen egy másik funkció hívja annak érdekében, hogy az eredmény, amit akar?
>> Nos, az ok ez működik az az oka, Az valami ismert hívás verem.
Ha hívja a funkciót, a rendszer félreteszi hely a memóriában
az adott funkcióra, hogy tegye a dolgát.
És hívjuk ezeket a darabokat a memória a hatályon kívül helyezését az egyes funkciók
hívni egy verem keret vagy funkció keretben.
És ahogy az várható, Ezek stack frame
él a stack része a memória.
>> Egynél több funkciót verem létezhet a memóriában egy adott időben.
Ha fő meghív egy függvényt lépés, és a lépés felhívja irányba,
Mindhárom funkció van nyitva kereteket.
De nem minden aktív kereteket.
Ezek a keretek vannak elrendezve egy verem.
És a keretet a hívtunk
funkció mindig a verem tetején.
És, hogy az mindig az aktív keretben.
Már csak igazán soha egyetlen funkciót, ami lehet aktív.
Ez az egyik a tetején a verem.
>> Amikor egy függvény meghívja a másik funkciót, ez a fajta megnyomja szünet.
Ez a fajta van zárva, akkor vár.
És még egy verem keret tolta a verembe a tetején.
És ez lesz az aktív keretben.
És a keret azonnal alatta kell várni
amíg ez megint az aktív keret mielőtt folytatja munkáját.
Amikor egy funkció teljes és kész,
A keret pattant ki a köteget.
Ez a terminológiát.
És a keret azonnal alatta, ahogy az előbb mondtam,
lesz az új aktív keretben.
>> És ha felhív egy másik funkció, ez lesz ismét szünetet.
Ez az új funkció a verem keret nyomni rá a tetején a verem.
Ez lesz a dolgát.
Lehet, hogy pop vissza le.
És a többi funkció alatta folytathatja újra.
>> Szóval menjünk át ezt újra, keres a gondolatra, hogy a faktoriális függvény
hogy meghatározott rekurzív videó megtekintéséhez
pontosan a mágia mögött rekurzív folyamat zajlik.
Szóval ez a mi egész fájlt, ugye?
Mi határozza meg a két functions-- fő- és tény.
És ahogy az várható, minden C program folyik
kezdeni az első sorban a fő.
>> Így létrejön egy verem keret fő.
És ez meg fog ezután kezdődhet el.
Fő hívások printf.
És a printf fog nyomtassa ki faktoriálisát 5.
Nos, ez nem tudom, mi faktoriálisát 5,
és így ez a hívás már attól függően, hogy egy másik függvényhívás.
Tehát fő fog szünet ott.
Fogom hagyni, hogy nyíl ott, színes
ez ugyanolyan színű, mint a verem a jobb oldalon,
jelezve, hogy a fő megy, hogy fagyassza Itt míg faktoriálisát 5 nevezik.
>> Tehát faktoriálisát 5 nevezik.
És ez meg fog kezdeni a nagyon elején a faktoriális függvény.
Ez teszi fel a kérdést én egyenlő 1?
5 egyenlő 1?
Hát nem.
Szóval ez fog lemenni A más részét, cserébe n-szer
faktoriálisát n mínusz 1.
Akkor jó.
>> Tehát most, faktoriálisát 5 attól függően, hogy egy másik hívást
a faktoriális, átadva 4 paraméterként.
És így faktoriálisát 5 keret, hogy a piros kerettel,
megy, hogy fagyassza ott abban vonal, amit megjelölt
és várjon faktoriálisát 4 befejezni mit kell tenni annak érdekében, hogy akkor
válhat az aktív frame újra.
>> Tehát faktoriálisát 4 kezdet Az elején faktoros.
4 egyenlő 1?
Nem, így fog tenni ugyanezt.
Meg fog lemenni az else ág.
Meg fog eljutni, hogy kódsort.
OK, megyek vissza négyszer.
Ó, faktoriálisát 3-- így faktoriálisát 4 függ faktoriálisát 3 befejező.
>> És ezért kell hívni faktoriálisát 3.
És ez fog átmenni ugyanez a folyamat újra.
Ez a tanulás, ideér.
Faktoriálisát 3 múlik A faktoriálisát 1.
Tehát faktoriálisát 2 kezdődik, ideér.
Attól függ, faktoriálisát 1.
Faktoriálisát 1 megkezdődik.
>> OKÉ.
Tehát most, mi megvagyunk Valahol érdekes, ugye?
Tehát most, 1 egyenlő 1.
És így visszatérünk 1.
Ezen a ponton visszatérünk.
A funkció kész.
Ez a magatartása is-- van semmi mást nem kell tennie,
és így a verem keret faktoriálisát 1 durran ki.
Kész van.
Ez iránt 1.
És most, faktoriálisát 2, amely volt a keret közvetlenül alatta
a verem, lesz az aktív keretben.
>> És akkor vegye fel pontosan ott, ahol abbahagyta.
Ez már vár egy faktoros 1 befejezni a munkát.
Mára elkészült.
És így itt vagyunk.
>> Faktoriálisát 1 visszaadott értéke 1.
Tehát faktoriálisát 2 doboz mondjuk visszatér 2-szer 1.
Munkáját most történik.
Ez visszatért 2 faktoriális 3, amely már várt is.
Faktoriálisát 3 most a felső keret, Az aktív keret a stack.
És ez így mondja, OK, nos, én megyek hogy visszatérjen 3-szor 2, amely 6.
És fogok adni, hogy értéket vissza faktoros
4, amely már várt rám.
Végeztem.
Faktoriálisát 3 durran ki a köteget, faktoriálisát 4 jelenleg az aktív keretben.
>> 4. mondja, OK, megyek vissza 4-szer faktoriálisát 3 volt, ami hat.
Ez volt az érték, faktoriálisát 3 visszatért.
És így 4-szer 6 24.
És megyek át hogy vissza Faktoriális
5, amely már várt rám.
Faktoriálisát 5 most az aktív keret.
Meg fog visszatérni 5 alkalommal faktoriálisát 4-- 5-ször 24, illetve 120--
és adja az értéket vissza a fő, amely
vártunk nagyon türelmesen egy hosszú ideig alján a verem.
>> Ez ahonnan indultak.
Ez tette ezt a hívást.
Több keretek vette át a tetején.
Ez most vissza a köteg tetején.
Ez az aktív keret.
Tehát fő kapott értéket 120 vissza faktoriálisát 5.
Ez már várja, hogy nyomtassa ki ezt az értéket.
És akkor kell ezt csinálni.
Nincs több sornyi kódot fő.
Tehát a fő frame durran ki verem, és már készen is vagyunk.
>> És így rekurzió működik.
Így stack frame dolgozni.
Azok a funkciót hívások ez történt korábban
csak a szünet, vár A következő hívás
befejezni így lesz aktív váz és befejezni, amit tennie kell.
>> Én Doug Lloyd.
Ez CS50.