DOUG LLOYD: Kui olete näinud video recursion,
Kogu protsess võib olla Tundus natuke maagiline.
Kuidas see töötab?
Kuidas funktsioone tean, et nad pead ootama ja ootama veel väärtust
naasta erinev funktsioon helistada, et saada tulemus tahame?
>> Noh, põhjus see toimib on seetõttu midagi teada, kui pinu.
Kui te helistate funktsiooni Süsteem tühistab ruumi mälu
eest, et funktsioon oma tööd teha.
Ja me kutsume neid tükkideks mälu mida kõrvale iga funktsiooni
helistada freimi või funktsiooni raami.
Ja kui te võite arvata, Nende korstnat raamid
elavad korstna osa mälu.
>> Rohkem kui üks funktsioon freimi võib esineda mälu ajahetkel.
Kui peamine nõuab funktsiooni liikuda, ja liigu kutsub suunas,
kõik kolm funktsiooni on avatud raamid.
Aga nad kõik ei ole aktiivne raamid.
Need raamid on paigutatud virna.
Ja raami viimati helistasite
funktsioon on alati peal virnas.
Ja see on alati aktiivne raami.
Seal on ainult tõesti kunagi üks funktsiooni, mis on aktiivne korraga.
See on üks peal virnas.
>> Kui funktsioon nõuab teise funktsiooni, see omamoodi vajutab pausi.
See omamoodi on ootel, ootab.
Ja veel üks freimi surutakse peale virna peal.
Ja see muutub aktiivseks raami.
Ja raam kohe all peab ootama
kuni see on jälle aktiivne raam enne kui ta saab jätkata oma tööd.
Kui funktsioon on täielik ja ta on teinud,
selle raami hüppasid välja virna.
See on terminoloogia.
Ja raam kohe selle all, kui ma ütlesin,
muutub uue aktiivse raami.
>> Ja kui see nõuab teise funktsiooni, see saab peatada uuesti.
See uus funktsioon on stack raam lükatakse peale riidale.
Seda saad teha oma tööd.
See võib hüpata tagasi maha.
Ja teine ​​funktsioon Allpool on võimalik jätkata uuesti.
>> Nii saab seda uuesti läbi vaadates idee juures faktoriaali funktsiooni
et me määratletud recursion video vaatamiseks
kuidas täpselt magic taga rekursiivne protsess toimub.
Nii et see on kogu meie faili, eks?
Me määratletud kaks functions-- peamine ja fakt.
Ja kui me võiksime oodata, mis tahes C programmi läheb
alustada esimesel real peamine.
>> Nii loome uue freimi jaoks peamine.
Ja see läheb ilmuma hakkavad.
Main kõned printf.
Ja printf läheb välja printida faktoriaali 5.
Noh, see ei ole teada, Mis faktoriaali 5 on
ja nii see kõne on juba Sõltuvalt teise funktsioon kõne.
Nii peamiseks läheb pausi seal.
Ma jätan selle nool seal, värv
see sama värvi Kestab raami paremal,
mis näitab, et peamine saab külmutada siin samas faktoriaali 5 nimetatakse.
>> Nii faktoriaali 5 nimetatakse.
Ja see läheb algavad väga alguses faktoriaali funktsiooni.
Ta küsib küsimuse ma võrdne 1?
Kas 5 võrdne 1?
Noh, ei ole.
Nii see läheb minna else osa, tagastamise n korda
faktoriaali n miinus 1.
Noh, OK.
>> Nüüd, faktoriaali 5 on Sõltuvalt teise kõne
et faktoriaal, mis kulgeb 4 parameetrina.
Ja nii faktoriaali 5 raami, et punane raam,
läheb külmutada seal sel line Olen märgitud
ja oodake faktoriaali 4 lõpuni mida ta vajab selleks, et siis
võib saada aktiivne raam uuesti.
>> Nii faktoriaali 4 algab alguses faktoriaaliga.
Kas 4 võrdub 1?
Ei, nii see läheb teha sama asja.
See saab minna mööda teise filiaali.
See hakka, et rida koodi.
OK, ma lähen tagasi neli korda.
Oh, faktoriaali 3-- nii faktoriaali 4 sõltub faktoriaali 3 viimistlus.
>> Ja nii ta vajab helistada faktoriaali 3.
Ja seda lähen läbi sama protsessi uuesti.
See algab läbi, saab siin.
Faktoriaali 3 sõltub faktoritestauksessa 1.
Nii faktoriaali 2 hakkab, saab siin.
See sõltub faktoriaali 1.
Factorial 1 algab.
>> OKEI.
Nüüd, me lähme mõnes huvitavas kohas, eks?
Nüüd, 1 võrdub 1.
Ja nii me tagasi 1.
Sel hetkel, me oleme tagasi.
Funktsioon on teinud.
See on käitumine on-- seal midagi muud, siis teha,
ja nii freimi jaoks faktoriaali 1 hüppab välja.
See kõik on lõppenud.
See andis 1.
Ja nüüd, faktoriaali 2, mis oli raam kohe selle all
pakis, muutub aktiivseks raami.
>> Ja see ei korja täpselt, kus see pooleli jäi.
See on oodanud faktoriaal 1. lõpetada oma töö.
Nüüdseks lõppenud.
Ja nii siin me oleme.
>> Factorial 1 tagastatud väärtus 1.
Nii faktoriaali 2 purk ütleme tagasi 2 korda 1.
Selle töö on nüüd tehtud.
See on tagastatud 2 faktoriaal 3, mis ootas ta.
Faktoriaali 3 on nüüd top raami, aktiivse raami pinu.
Ja nii ta ütleb, OK, ma siis lähen tagastama 3 korda 2, milleks on 6.
Ja ma annan selle Väärtustame tagasi faktoriaali
4, mis on mind ootamas.
Olen lõpetanud.
Faktoriaali 3 hüppab välja virna ja faktoriaali 4 on nüüd aktiivne raami.
>> 4 ütleb, OK, ma lähen tagasi 4 korda faktoriaali 3, mis oli kuus.
See oli väärtus, faktoriaali 3 tagasi.
Ja nii 4 korda 6 on 24.
Ja ma lähen edasi et back to faktoriaal
5, mis on mind ootamas.
Factorial 5 on nüüd aktiivne raami.
See läheb tagasi 5 korda faktoriaali 4-- 5 korda 24 või 120--
ja anda selle väärtus Tagasi, mis on
oodanud väga kannatlikult kaua allosas magasini.
>> See on koht, kus see algas.
Ta tegi seda üleskutset.
Mitmed raamid võttis üle tipus.
See on nüüd tagasi peal virnas.
See on aktiivses vaates.
Nii peamine sain väärtus 120 tagasi faktoriaali 5.
See on oodanud välja printida, et väärtus.
Ja siis ta on teinud.
Pole veel rida koodi peamine.
Nii peamine raami hüppab off korstnat ning me teinud.
>> Ja see, kuidas recursion toimib.
See, kuidas korstnat raamid tööd.
Need funktsioon nõuab mis juhtus varem
on lihtsalt pausi, oodates hilisema kõned
lõpetada, et nad võivad muutuda aktiivseks raam ja lõpetada, mida nad peavad tegema.
>> Ma olen Doug Lloyd.
See on CS50.