Doug LLOYD: Če ste videli video na rekurzije,
celoten proces morda zdelo malo čaroben.
Kako deluje?
Kako funkcije vedo, da treba čakati in čakati na drugo vrednostjo
vrniti iz druge funkcije klic, da bi dobili rezultat, ki jo želimo?
>> No, razlog to deluje, ker nečesa znanega kot klicni dimnika.
Ko pokličete funkcijo, Sistem razveljavi prostora v pomnilniku
za to funkcijo, da opravi svoje delo.
In pravimo te kose pomnilnika, so se v prahi za vsako funkcijo
pokličite kup okvir ali funkcijo okvirja.
In kot bi lahko pričakovali, ti konzoli okvirji
živi na dimnik del pomnilnika.
>> Več kot eno funkcijo skladovnica okvir lahko obstaja v pomnilniku v določenem času.
Če glavni kliče funkcijo premakniti, in poteza poziva smer,
vse tri funkcije imajo odprte okvirje.
Ampak ne vsi imajo aktivne okvirje.
Ta ogrodja so razporejeni v skladovnici.
In okvirjem iz Najbolj nedavno pozval
Funkcija je vedno na vrhu kupa.
In da je vedno aktivna okvir.
Tam je res samo kdaj ena funkcija, ki je aktivna v trenutku.
To je eden na vrhu kupa.
>> Ko funkcija zahteva drugo Funkcija je nekako pritisne pavzo.
To nekako je na čakanju, ki čakajo.
In še en kup okvir potisnilo na skladovnici na vrhu je.
In da postane aktivna okvir.
In okvirjem takoj Spodaj je treba počakati
dokler ni ponovno aktivna okvir preden se lahko nadaljuje svoje delo.
Ko funkcija popolna in to je storil,
njen okvir je izstrelil off kup.
Da je terminologija.
In okvirjem takoj pod njo, kot sem rekel,
postane novi aktivni okvir.
>> In če to zahteva drugo funkcijo, to bo spet premor.
Da je nova funkcija je kup okvir bo treba potisniti na vrhu kupa.
To bom naredil svoje delo.
Morda pop nazaj dol.
In druga funkcija Spodaj pa lahko spet nadaljuje.
>> Torej, gremo skozi to še enkrat, išče na idejo faktorski funkcije
da smo definirali v rekurzija video za prikaz
točno, kako čarobno za to rekurzivni postopek poteka.
Torej je to naš celoten spis, kajne?
Opredelili smo dva functions-- glavni in dejstvo.
In kot lahko pričakujemo, vsak program C se dogaja
začeti na prvi vrstici glavni.
>> Tako smo ustvarili nov sveženj okvir za glavno.
In to se dogaja, da se začnejo prikazovati.
Glavni klici printf.
In printf se dogaja, da izpisal fakulteto 5.
No, ne vem, kaj faktorsko 5 je,
in zato je ta poziv je že odvisno na drugem klicu funkcije.
Torej glavno se dogaja, da se ustavite tam.
Bom zapustil njeno arrow tam, barvo
je enake barve kot kup okvir na desni strani,
kar pomeni, da glavno se dogaja, da zamrzne Tukaj medtem faktorsko 5 se imenuje.
>> Tako faktorski 5 se imenuje.
In to se dogaja, da začnejo pri zelo začenši od faktorski funkcije.
Sprašuje vprašanje sem enak 1?
5 enak 1?
No, no.
Tako se dogaja, da gredo navzdol drug del, donosnost n krat
faktorski n minus 1.
No, v redu.
>> Torej sedaj, faktorsko 5 je odvisno drug klic
na fakulteto, ki poteka v 4 kot parameter.
In tako fakulteto 5 okvir, da rdečim okvirjem,
se dogaja, da zamrzne tam na tej progi sem navedla
in čakati na fakulteto 4 do konca kaj je potrebno storiti, da bi ga
lahko spet postane aktivna okvirja.
>> Torej fakulteto 4 začne ob začetek factorial.
4 enako 1?
Ne, tako se dogaja, da storijo enako stvar.
To se dogaja, da gredo navzdol drugega podružnico.
To se dogaja, da pridete do te vrstice kode.
OK, bom vrniti štirikrat.
Oh, faktorski od 3-- tako fakulteto 4 odvisen fakulteto 3 dodelavo.
>> In zato je potrebno poklicati fakulteto 3.
In da se bo šel skozi spet isti postopek.
Začne skozi, tu dobi.
Faktorski dne 3. odvisna na fakulteto 1.
Tako faktorski 2 zagonov, dobi tukaj.
To je odvisno od fakulteto 1.
Faktorski od 1 vklopov.
>> V REDU.
Torej, zdaj, smo dobili nekje zanimivo, kajne?
Sedaj, 1 enak 1.
In tako smo se vrnili 1.
Na tej točki se vračamo.
Funkcija je naredil.
To je vedenje is-- obstaja nič drugega, za to storiti,
in tako Snop okvir za faktorski dne 1. pops off.
To je končano.
To je vrnil 1.
In zdaj, faktorski od 2, ki je okvir takoj pod njim
v skladovnici, postane aktivna okvir.
>> In lahko poberem točno tam, kjer je končal.
To je čakala za fakulteto od 1. končati svoje delo.
Zdaj je končano.
In zato smo tukaj.
>> Faktorski dne 1. vrnjena vrednost 1.
Tako faktorski 2 pločevinki recimo vrniti 2-krat 1.
Njegovo delo je zdaj končano.
To je vrnil 2 za fakulteto od 3, ki je čakal njo.
Fakulteta za 3 je zdaj top okvir, aktivna okvir v skladovnici.
In tako pravi, OK, no, jaz grem , da se vrnete 3 krat 2, ki je 6.
In bom dal, da cenijo nazaj na fakulteto
od 4, ki je bil me čaka.
Končal sem.
Faktorski dne 3. pops off kup, in faktorski dne 4. je zdaj aktiven okvir.
>> 4 pravi, OK, grem, da se vrnete 4-krat fakulteto 3, ki je bil šest.
To je bilo od vrednosti, ki jo faktorski dne 3. vrnil.
In tako 4 krat 6 je 24.
In grem mimo da nazaj na fakulteto
5, ki je bil me čaka.
Faktorski 5 je zdaj aktiven okvir.
To se dogaja, da se vrnete 5-krat fakulteto 4-- 5-krat 24 ali 120--
in daje to vrednost nazaj na glavno, ki ima
čakali zelo potrpežljivo Dolgo časa na dnu dimnika.
>> Tam, kjer se je začelo.
To je ta poziv.
Več okvirji prevzel na vrhu.
Zdaj je spet na vrhu kupa.
To je aktivna okvir.
Torej glavni dobil vrednost 120 nazaj od fakulteto 5.
To je čakal, da natisnete te vrednosti.
In potem je to storjeno.
Ni več vrstic kode v glavnem.
Torej, okvir glavni je pops off stack, in sva končala.
>> In to je, kako rekurzija deluje.
To je, kako konzoli okvirji delujejo.
Ti klici funkcij prej, da se je zgodilo
so le na premor, čaka za nadaljnje klice
do konca, tako da lahko postane aktivna kompozicije in konča, kaj morajo storiti.
>> Sem Doug Lloyd.
To je CS50.