1 00:00:00,000 --> 00:00:05,587 2 00:00:05,587 --> 00:00:07,670 DOUG LLOYD: Kui olete näinud video recursion, 3 00:00:07,670 --> 00:00:10,170 Kogu protsess võib olla Tundus natuke maagiline. 4 00:00:10,170 --> 00:00:10,930 Kuidas see töötab? 5 00:00:10,930 --> 00:00:15,010 Kuidas funktsioone tean, et nad pead ootama ja ootama veel väärtust 6 00:00:15,010 --> 00:00:19,150 naasta erinev funktsioon helistada, et saada tulemus tahame? 7 00:00:19,150 --> 00:00:22,550 >> Noh, põhjus see toimib on seetõttu midagi teada, kui pinu. 8 00:00:22,550 --> 00:00:26,360 Kui te helistate funktsiooni Süsteem tühistab ruumi mälu 9 00:00:26,360 --> 00:00:28,120 eest, et funktsioon oma tööd teha. 10 00:00:28,120 --> 00:00:31,720 Ja me kutsume neid tükkideks mälu mida kõrvale iga funktsiooni 11 00:00:31,720 --> 00:00:35,670 helistada freimi või funktsiooni raami. 12 00:00:35,670 --> 00:00:38,290 Ja kui te võite arvata, Nende korstnat raamid 13 00:00:38,290 --> 00:00:41,000 elavad korstna osa mälu. 14 00:00:41,000 --> 00:00:43,960 15 00:00:43,960 --> 00:00:47,540 >> Rohkem kui üks funktsioon freimi võib esineda mälu ajahetkel. 16 00:00:47,540 --> 00:00:51,240 Kui peamine nõuab funktsiooni liikuda, ja liigu kutsub suunas, 17 00:00:51,240 --> 00:00:54,460 kõik kolm funktsiooni on avatud raamid. 18 00:00:54,460 --> 00:00:57,350 Aga nad kõik ei ole aktiivne raamid. 19 00:00:57,350 --> 00:00:59,410 Need raamid on paigutatud virna. 20 00:00:59,410 --> 00:01:01,820 Ja raami viimati helistasite 21 00:01:01,820 --> 00:01:04,390 funktsioon on alati peal virnas. 22 00:01:04,390 --> 00:01:07,150 Ja see on alati aktiivne raami. 23 00:01:07,150 --> 00:01:10,420 Seal on ainult tõesti kunagi üks funktsiooni, mis on aktiivne korraga. 24 00:01:10,420 --> 00:01:12,420 See on üks peal virnas. 25 00:01:12,420 --> 00:01:17,620 >> Kui funktsioon nõuab teise funktsiooni, see omamoodi vajutab pausi. 26 00:01:17,620 --> 00:01:20,590 See omamoodi on ootel, ootab. 27 00:01:20,590 --> 00:01:24,050 Ja veel üks freimi surutakse peale virna peal. 28 00:01:24,050 --> 00:01:26,150 Ja see muutub aktiivseks raami. 29 00:01:26,150 --> 00:01:28,600 Ja raam kohe all peab ootama 30 00:01:28,600 --> 00:01:33,560 kuni see on jälle aktiivne raam enne kui ta saab jätkata oma tööd. 31 00:01:33,560 --> 00:01:35,870 Kui funktsioon on täielik ja ta on teinud, 32 00:01:35,870 --> 00:01:37,720 selle raami hüppasid välja virna. 33 00:01:37,720 --> 00:01:38,950 See on terminoloogia. 34 00:01:38,950 --> 00:01:41,110 Ja raam kohe selle all, kui ma ütlesin, 35 00:01:41,110 --> 00:01:42,880 muutub uue aktiivse raami. 36 00:01:42,880 --> 00:01:45,960 >> Ja kui see nõuab teise funktsiooni, see saab peatada uuesti. 37 00:01:45,960 --> 00:01:49,290 See uus funktsioon on stack raam lükatakse peale riidale. 38 00:01:49,290 --> 00:01:50,650 Seda saad teha oma tööd. 39 00:01:50,650 --> 00:01:52,100 See võib hüpata tagasi maha. 40 00:01:52,100 --> 00:01:55,630 Ja teine ​​funktsioon Allpool on võimalik jätkata uuesti. 41 00:01:55,630 --> 00:02:00,080 >> Nii saab seda uuesti läbi vaadates idee juures faktoriaali funktsiooni 42 00:02:00,080 --> 00:02:03,070 et me määratletud recursion video vaatamiseks 43 00:02:03,070 --> 00:02:07,770 kuidas täpselt magic taga rekursiivne protsess toimub. 44 00:02:07,770 --> 00:02:09,870 Nii et see on kogu meie faili, eks? 45 00:02:09,870 --> 00:02:14,000 Me määratletud kaks functions-- peamine ja fakt. 46 00:02:14,000 --> 00:02:15,980 Ja kui me võiksime oodata, mis tahes C programmi läheb 47 00:02:15,980 --> 00:02:18,470 alustada esimesel real peamine. 48 00:02:18,470 --> 00:02:21,660 >> Nii loome uue freimi jaoks peamine. 49 00:02:21,660 --> 00:02:23,320 Ja see läheb ilmuma hakkavad. 50 00:02:23,320 --> 00:02:25,270 Main kõned printf. 51 00:02:25,270 --> 00:02:29,390 Ja printf läheb välja printida faktoriaali 5. 52 00:02:29,390 --> 00:02:31,440 Noh, see ei ole teada, Mis faktoriaali 5 on 53 00:02:31,440 --> 00:02:35,620 ja nii see kõne on juba Sõltuvalt teise funktsioon kõne. 54 00:02:35,620 --> 00:02:37,270 Nii peamiseks läheb pausi seal. 55 00:02:37,270 --> 00:02:39,103 Ma jätan selle nool seal, värv 56 00:02:39,103 --> 00:02:41,360 see sama värvi Kestab raami paremal, 57 00:02:41,360 --> 00:02:47,720 mis näitab, et peamine saab külmutada siin samas faktoriaali 5 nimetatakse. 58 00:02:47,720 --> 00:02:49,300 >> Nii faktoriaali 5 nimetatakse. 59 00:02:49,300 --> 00:02:53,160 Ja see läheb algavad väga alguses faktoriaali funktsiooni. 60 00:02:53,160 --> 00:02:55,440 Ta küsib küsimuse ma võrdne 1? 61 00:02:55,440 --> 00:02:56,810 Kas 5 võrdne 1? 62 00:02:56,810 --> 00:02:57,410 Noh, ei ole. 63 00:02:57,410 --> 00:03:01,110 Nii see läheb minna else osa, tagastamise n korda 64 00:03:01,110 --> 00:03:02,990 faktoriaali n miinus 1. 65 00:03:02,990 --> 00:03:03,490 Noh, OK. 66 00:03:03,490 --> 00:03:07,070 >> Nüüd, faktoriaali 5 on Sõltuvalt teise kõne 67 00:03:07,070 --> 00:03:09,740 et faktoriaal, mis kulgeb 4 parameetrina. 68 00:03:09,740 --> 00:03:14,210 Ja nii faktoriaali 5 raami, et punane raam, 69 00:03:14,210 --> 00:03:17,160 läheb külmutada seal sel line Olen märgitud 70 00:03:17,160 --> 00:03:21,914 ja oodake faktoriaali 4 lõpuni mida ta vajab selleks, et siis 71 00:03:21,914 --> 00:03:23,330 võib saada aktiivne raam uuesti. 72 00:03:23,330 --> 00:03:26,890 >> Nii faktoriaali 4 algab alguses faktoriaaliga. 73 00:03:26,890 --> 00:03:28,556 Kas 4 võrdub 1? 74 00:03:28,556 --> 00:03:30,180 Ei, nii see läheb teha sama asja. 75 00:03:30,180 --> 00:03:31,590 See saab minna mööda teise filiaali. 76 00:03:31,590 --> 00:03:33,240 See hakka, et rida koodi. 77 00:03:33,240 --> 00:03:35,710 OK, ma lähen tagasi neli korda. 78 00:03:35,710 --> 00:03:41,270 Oh, faktoriaali 3-- nii faktoriaali 4 sõltub faktoriaali 3 viimistlus. 79 00:03:41,270 --> 00:03:43,055 >> Ja nii ta vajab helistada faktoriaali 3. 80 00:03:43,055 --> 00:03:45,180 Ja seda lähen läbi sama protsessi uuesti. 81 00:03:45,180 --> 00:03:48,200 See algab läbi, saab siin. 82 00:03:48,200 --> 00:03:50,980 Faktoriaali 3 sõltub faktoritestauksessa 1. 83 00:03:50,980 --> 00:03:53,750 Nii faktoriaali 2 hakkab, saab siin. 84 00:03:53,750 --> 00:03:56,310 See sõltub faktoriaali 1. 85 00:03:56,310 --> 00:03:57,430 Factorial 1 algab. 86 00:03:57,430 --> 00:03:57,650 >> OKEI. 87 00:03:57,650 --> 00:03:59,775 Nüüd, me lähme mõnes huvitavas kohas, eks? 88 00:03:59,775 --> 00:04:02,190 Nüüd, 1 võrdub 1. 89 00:04:02,190 --> 00:04:05,130 Ja nii me tagasi 1. 90 00:04:05,130 --> 00:04:06,770 Sel hetkel, me oleme tagasi. 91 00:04:06,770 --> 00:04:07,880 Funktsioon on teinud. 92 00:04:07,880 --> 00:04:11,140 See on käitumine on-- seal midagi muud, siis teha, 93 00:04:11,140 --> 00:04:17,006 ja nii freimi jaoks faktoriaali 1 hüppab välja. 94 00:04:17,006 --> 00:04:17,589 See kõik on lõppenud. 95 00:04:17,589 --> 00:04:19,480 See andis 1. 96 00:04:19,480 --> 00:04:23,370 Ja nüüd, faktoriaali 2, mis oli raam kohe selle all 97 00:04:23,370 --> 00:04:26,160 pakis, muutub aktiivseks raami. 98 00:04:26,160 --> 00:04:29,030 >> Ja see ei korja täpselt, kus see pooleli jäi. 99 00:04:29,030 --> 00:04:32,240 See on oodanud faktoriaal 1. lõpetada oma töö. 100 00:04:32,240 --> 00:04:33,610 Nüüdseks lõppenud. 101 00:04:33,610 --> 00:04:35,510 Ja nii siin me oleme. 102 00:04:35,510 --> 00:04:38,080 >> Factorial 1 tagastatud väärtus 1. 103 00:04:38,080 --> 00:04:42,430 Nii faktoriaali 2 purk ütleme tagasi 2 korda 1. 104 00:04:42,430 --> 00:04:43,680 Selle töö on nüüd tehtud. 105 00:04:43,680 --> 00:04:49,110 See on tagastatud 2 faktoriaal 3, mis ootas ta. 106 00:04:49,110 --> 00:04:53,370 Faktoriaali 3 on nüüd top raami, aktiivse raami pinu. 107 00:04:53,370 --> 00:04:58,617 Ja nii ta ütleb, OK, ma siis lähen tagastama 3 korda 2, milleks on 6. 108 00:04:58,617 --> 00:05:00,700 Ja ma annan selle Väärtustame tagasi faktoriaali 109 00:05:00,700 --> 00:05:03,430 4, mis on mind ootamas. 110 00:05:03,430 --> 00:05:04,500 Olen lõpetanud. 111 00:05:04,500 --> 00:05:09,410 Faktoriaali 3 hüppab välja virna ja faktoriaali 4 on nüüd aktiivne raami. 112 00:05:09,410 --> 00:05:13,510 >> 4 ütleb, OK, ma lähen tagasi 4 korda faktoriaali 3, mis oli kuus. 113 00:05:13,510 --> 00:05:15,980 See oli väärtus, faktoriaali 3 tagasi. 114 00:05:15,980 --> 00:05:19,010 Ja nii 4 korda 6 on 24. 115 00:05:19,010 --> 00:05:20,990 Ja ma lähen edasi et back to faktoriaal 116 00:05:20,990 --> 00:05:23,160 5, mis on mind ootamas. 117 00:05:23,160 --> 00:05:25,270 Factorial 5 on nüüd aktiivne raami. 118 00:05:25,270 --> 00:05:30,700 See läheb tagasi 5 korda faktoriaali 4-- 5 korda 24 või 120-- 119 00:05:30,700 --> 00:05:32,722 ja anda selle väärtus Tagasi, mis on 120 00:05:32,722 --> 00:05:35,680 oodanud väga kannatlikult kaua allosas magasini. 121 00:05:35,680 --> 00:05:36,640 >> See on koht, kus see algas. 122 00:05:36,640 --> 00:05:37,670 Ta tegi seda üleskutset. 123 00:05:37,670 --> 00:05:39,400 Mitmed raamid võttis üle tipus. 124 00:05:39,400 --> 00:05:41,890 See on nüüd tagasi peal virnas. 125 00:05:41,890 --> 00:05:43,450 See on aktiivses vaates. 126 00:05:43,450 --> 00:05:47,810 Nii peamine sain väärtus 120 tagasi faktoriaali 5. 127 00:05:47,810 --> 00:05:50,750 See on oodanud välja printida, et väärtus. 128 00:05:50,750 --> 00:05:51,657 Ja siis ta on teinud. 129 00:05:51,657 --> 00:05:53,240 Pole veel rida koodi peamine. 130 00:05:53,240 --> 00:05:56,800 Nii peamine raami hüppab off korstnat ning me teinud. 131 00:05:56,800 --> 00:05:58,992 >> Ja see, kuidas recursion toimib. 132 00:05:58,992 --> 00:06:00,200 See, kuidas korstnat raamid tööd. 133 00:06:00,200 --> 00:06:03,120 Need funktsioon nõuab mis juhtus varem 134 00:06:03,120 --> 00:06:06,620 on lihtsalt pausi, oodates hilisema kõned 135 00:06:06,620 --> 00:06:12,050 lõpetada, et nad võivad muutuda aktiivseks raam ja lõpetada, mida nad peavad tegema. 136 00:06:12,050 --> 00:06:13,060 >> Ma olen Doug Lloyd. 137 00:06:13,060 --> 00:06:14,880 See on CS50. 138 00:06:14,880 --> 00:06:16,580