1 00:00:00,000 --> 00:00:05,587 2 00:00:05,587 --> 00:00:07,670 داگ لوید: اگر شما را دیده ام ویدئو در بازگشت، 3 00:00:07,670 --> 00:00:10,170 کل فرایند ممکن است به نظر می رسید کمی جادویی. 4 00:00:10,170 --> 00:00:10,930 چگونه کار می کند؟ 5 00:00:10,930 --> 00:00:15,010 چگونه توابع می دانیم که آنها نیاز به صبر و صبر کنید برای یکی دیگر از ارزش 6 00:00:15,010 --> 00:00:19,150 به بازگشت از یک تابع های مختلف پاسخ به منظور رسیدن به نتیجه ما می خواهیم؟ 7 00:00:19,150 --> 00:00:22,550 >> خوب، دلیل این کار این است به دلیل از چیزی شناخته شده به عنوان پاسخ پشته. 8 00:00:22,550 --> 00:00:26,360 هنگامی که شما یک تابع تماس، سیستم مجموعه کنار فضا در حافظه 9 00:00:26,360 --> 00:00:28,120 برای آن تابع به کار آن است. 10 00:00:28,120 --> 00:00:31,720 و ما این تکه از حافظه که پاسخ در حال کنار گذاشته برای هر تابع مجموعه 11 00:00:31,720 --> 00:00:35,670 یک قاب پشته و یا یک قاب تابع. 12 00:00:35,670 --> 00:00:38,290 و همانطور که انتظار می رود، این قاب پشته 13 00:00:38,290 --> 00:00:41,000 در بخشی از حافظه پشته زندگی می کنند. 14 00:00:41,000 --> 00:00:43,960 15 00:00:43,960 --> 00:00:47,540 >> بیش از یک تابع قاب پشته می توانید در حافظه در یک زمان معین وجود داشته باشد. 16 00:00:47,540 --> 00:00:51,240 اگر خواستار یک حرکت اصلی تابع، و حرکت می نامد جهت، 17 00:00:51,240 --> 00:00:54,460 هر سه توابع دارای قاب باز است. 18 00:00:54,460 --> 00:00:57,350 اما آنها فریم فعال است همه. 19 00:00:57,350 --> 00:00:59,410 این قاب ها در یک پشته مرتب شده اند. 20 00:00:59,410 --> 00:01:01,820 و قاب از اخیرا به نام 21 00:01:01,820 --> 00:01:04,390 تابع است که همیشه در بالای پشته. 22 00:01:04,390 --> 00:01:07,150 و این کار همیشه قاب فعال است. 23 00:01:07,150 --> 00:01:10,420 فقط واقعا تا کنون کسی وجود تابع است که فعال در یک زمان. 24 00:01:10,420 --> 00:01:12,420 این یکی در بالای پشته است. 25 00:01:12,420 --> 00:01:17,620 >> هنگامی که یک تابع دیگر خواستار تابع، آن نوع از پرس مکث. 26 00:01:17,620 --> 00:01:20,590 این نوع از است در انتظار، در انتظار است. 27 00:01:20,590 --> 00:01:24,050 و قاب پشته دیگری تحت فشار قرار دادند بر روی پشته در بالای آن. 28 00:01:24,050 --> 00:01:26,150 و قاب فعال می شود. 29 00:01:26,150 --> 00:01:28,600 و قاب بلافاصله در زیر آن نیاز به صبر 30 00:01:28,600 --> 00:01:33,560 تا زمانی که دوباره قاب فعال قبل از آن می توانید کار خود را از سر گرفت. 31 00:01:33,560 --> 00:01:35,870 زمانی که یک تابع است کامل و آن را انجام داده، 32 00:01:35,870 --> 00:01:37,720 قاب آن است از پشته. 33 00:01:37,720 --> 00:01:38,950 که اصطلاحات است. 34 00:01:38,950 --> 00:01:41,110 و قاب بلافاصله در زیر آن، همانطور که گفتم، 35 00:01:41,110 --> 00:01:42,880 قاب جدید فعال شود. 36 00:01:42,880 --> 00:01:45,960 >> و اگر آن را تابع دیگر را خواند، آن را به مکث دوباره. 37 00:01:45,960 --> 00:01:49,290 قاب پشته که تابع نو توان بر روی بالای پشته قرار. 38 00:01:49,290 --> 00:01:50,650 کار خود را انجام دهد. 39 00:01:50,650 --> 00:01:52,100 این ممکن است خاموش پاپ. 40 00:01:52,100 --> 00:01:55,630 و تابع دیگر زیر آن را دوباره می توانید از سر گرفت. 41 00:01:55,630 --> 00:02:00,080 >> بنابراین اجازه دهید از طریق این دوباره، به دنبال در این ایده از تابع فاکتوریل 42 00:02:00,080 --> 00:02:03,070 که ما در تعریف فیلم بازگشتی به دیدن 43 00:02:03,070 --> 00:02:07,770 دقیقا چگونه سحر و جادو در پشت این روند بازگشتی در حال وقوع است. 44 00:02:07,770 --> 00:02:09,870 بنابراین این فایل کامل است، درست است؟ 45 00:02:09,870 --> 00:02:14,000 ما دو تعریف functions-- اصلی و واقعیت است. 46 00:02:14,000 --> 00:02:15,980 و همانطور که ما ممکن است انتظار، هر برنامه C است که 47 00:02:15,980 --> 00:02:18,470 در خط اول اصلی شروع می شود. 48 00:02:18,470 --> 00:02:21,660 >> بنابراین ما یک قاب پشته جدید برای اصلی ایجاد کنید. 49 00:02:21,660 --> 00:02:23,320 و آن را برای شروع در حال اجرا. 50 00:02:23,320 --> 00:02:25,270 تماس اصلی printf است. 51 00:02:25,270 --> 00:02:29,390 و تابع () printf است که به نسخه قابل چاپ کردن فاکتوریل 5. 52 00:02:29,390 --> 00:02:31,440 خوب، آن را نمی داند چه عاملی 5، 53 00:02:31,440 --> 00:02:35,620 و بنابراین این پاسخ در حال حاضر بسته به یکی دیگر از فراخوانی تابع است. 54 00:02:35,620 --> 00:02:37,270 بنابراین اصلی است که به مکث سمت راست وجود دارد. 55 00:02:37,270 --> 00:02:39,103 من میخوام ترک هستم آن فلش سمت راست وجود دارد، رنگ 56 00:02:39,103 --> 00:02:41,360 آن همان رنگ به عنوان پشته قاب در سمت راست، 57 00:02:41,360 --> 00:02:47,720 نشان می دهد که اصلی است که به یخ اینجا در حالی که فاکتوریل 5 نامیده می شود. 58 00:02:47,720 --> 00:02:49,300 >> بنابراین فاکتوریل 5 نامیده می شود. 59 00:02:49,300 --> 00:02:53,160 و آن را برای شروع در بسیار آغاز از تابع فاکتوریل. 60 00:02:53,160 --> 00:02:55,440 آن را می پرسد سوال من برابر با 1. 61 00:02:55,440 --> 00:02:56,810 است 5-1 برابر است؟ 62 00:02:56,810 --> 00:02:57,410 خب نه. 63 00:02:57,410 --> 00:03:01,110 طوری که آن را به پایین به دیگری بخشی، بازگشت n بار 64 00:03:01,110 --> 00:03:02,990 فاکتوریل n منهای 1. 65 00:03:02,990 --> 00:03:03,490 خب باشه. 66 00:03:03,490 --> 00:03:07,070 >> بنابراین در حال حاضر، فاکتوریل از 5 است بسته به تماس دیگر 67 00:03:07,070 --> 00:03:09,740 به فاکتوریل، عبور در 4 عنوان پارامتر. 68 00:03:09,740 --> 00:03:14,210 و به این ترتیب فاکتوریل 5 قاب، قاب که قرمز، 69 00:03:14,210 --> 00:03:17,160 در حال رفتن به سمت راست وجود دارد منجمد که در آن خط نشان دادم 70 00:03:17,160 --> 00:03:21,914 و منتظر فاکتوریل 4 به پایان برساند آنچه در آن نیاز به انجام این کار است که پس از آن 71 00:03:21,914 --> 00:03:23,330 می توانید قاب را دوباره فعال می شود. 72 00:03:23,330 --> 00:03:26,890 >> بنابراین از 4 شروع می شود فاکتوریل در آغاز فاکتوریل. 73 00:03:26,890 --> 00:03:28,556 است 4-1 برابر است؟ 74 00:03:28,556 --> 00:03:30,180 نه، تا آن را به انجام همان چیزی. 75 00:03:30,180 --> 00:03:31,590 آن را به پایین شاخه دیگری. 76 00:03:31,590 --> 00:03:33,240 آن را برای رسیدن به آن خط از کد. 77 00:03:33,240 --> 00:03:35,710 خوب، من قصد دارم به بازگشت چهار بار. 78 00:03:35,710 --> 00:03:41,270 اوه، فاکتوریل 3-- پس از فاکتوریل 4 بستگی به عاملی 3 به پایان رساندن. 79 00:03:41,270 --> 00:03:43,055 >> و پس از آن نیاز به فاکتوریل 3 پاسخ. 80 00:03:43,055 --> 00:03:45,180 و که میخوام از طریق رفتن این فرآیند را دوباره همان. 81 00:03:45,180 --> 00:03:48,200 این شروع می شود از طریق، می شود در اینجا. 82 00:03:48,200 --> 00:03:50,980 عاملی بستگی دارد 3 در فاکتوریل، از مجموع 1 83 00:03:50,980 --> 00:03:53,750 بنابراین فاکتوریل 2 شروع می شود، می شود در اینجا. 84 00:03:53,750 --> 00:03:56,310 آن را بر روی فاکتوریل 1 بستگی دارد. 85 00:03:56,310 --> 00:03:57,430 عاملی 1 شروع می شود. 86 00:03:57,430 --> 00:03:57,650 >> باشه. 87 00:03:57,650 --> 00:03:59,775 بنابراین در حال حاضر، ما در حال گرفتن جایی جالب، درست است؟ 88 00:03:59,775 --> 00:04:02,190 بنابراین در حال حاضر، از 1 به 1 برابر است. 89 00:04:02,190 --> 00:04:05,130 و بنابراین ما بازگشت 1. 90 00:04:05,130 --> 00:04:06,770 در این مرحله، ما در حال بازگشت. 91 00:04:06,770 --> 00:04:07,880 تابع انجام می شود. 92 00:04:07,880 --> 00:04:11,140 رفتار آن را is-- وجود دارد هیچ چیز دیگری برای آن را به انجام، 93 00:04:11,140 --> 00:04:17,006 و به همین ترتیب قاب پشته برای فاکتوریل 1 میآید کردن. 94 00:04:17,006 --> 00:04:17,589 تمام شد. 95 00:04:17,589 --> 00:04:19,480 این بازگشت 1. 96 00:04:19,480 --> 00:04:23,370 و در حال حاضر، فاکتوریل 2، که قاب بلافاصله در زیر آن بود 97 00:04:23,370 --> 00:04:26,160 در پشته، قاب فعال می شود. 98 00:04:26,160 --> 00:04:29,030 >> و آن را می توانید انتخاب کنید دقیقا همان جایی که آن را ترک کردن. 99 00:04:29,030 --> 00:04:32,240 این شده است که در انتظار یک فاکتوریل از 1 به پایان کار آن است. 100 00:04:32,240 --> 00:04:33,610 این در حال حاضر به پایان رسید. 101 00:04:33,610 --> 00:04:35,510 و بنابراین در اینجا ما می باشد. 102 00:04:35,510 --> 00:04:38,080 >> عاملی 1 مقدار 1 بازگشت. 103 00:04:38,080 --> 00:04:42,430 بنابراین فاکتوریل 2 را می بگو 2 بار 1 بازگشت. 104 00:04:42,430 --> 00:04:43,680 کار خود را در حال حاضر انجام شده است. 105 00:04:43,680 --> 00:04:49,110 آن را بازگشت به فاکتوریل 2 3، که در انتظار بود برای آن است. 106 00:04:49,110 --> 00:04:53,370 عاملی 3 در حال حاضر قاب بالا، قاب فعال در پشته. 107 00:04:53,370 --> 00:04:58,617 و پس از آن می گوید، خوب، خوب، من قصد دارم به بازگشت 3 بار 2 است، که 6. 108 00:04:58,617 --> 00:05:00,700 و من قصد دارم به من بدهید که ارزش برگشت به فاکتوریل 109 00:05:00,700 --> 00:05:03,430 از 4، است که انتظار برای من. 110 00:05:03,430 --> 00:05:04,500 من انجام می شود. 111 00:05:04,500 --> 00:05:09,410 عاملی 3 میآید را از پشته، و فاکتوریل 4 در حال حاضر قاب فعال است. 112 00:05:09,410 --> 00:05:13,510 >> 4 می گوید: خوب، من قصد دارم به بازگشت 4 بار فاکتوریل 3، که شش سال داشت. 113 00:05:13,510 --> 00:05:15,980 که از ارزش این بود که فاکتوریل 3 بازگشت. 114 00:05:15,980 --> 00:05:19,010 و به این ترتیب 4 بار 6 24 است. 115 00:05:19,010 --> 00:05:20,990 و من قصد دارم به تصویب که به فاکتوریل 116 00:05:20,990 --> 00:05:23,160 از 5، است که انتظار برای من. 117 00:05:23,160 --> 00:05:25,270 عاملی 5 در حال حاضر قاب فعال است. 118 00:05:25,270 --> 00:05:30,700 آن را به بازگشت 5 بار فاکتوریل 4-- 5 بار 24 یا 120-- 119 00:05:30,700 --> 00:05:32,722 و که ارزش برگشت به بخش اصلی است، که 120 00:05:32,722 --> 00:05:35,680 شده است در انتظار بسیار با صبر و حوصله برای مدت زمان طولانی در پایین پشته. 121 00:05:35,680 --> 00:05:36,640 >> آن را که در آن آغاز شده است. 122 00:05:36,640 --> 00:05:37,670 از آن ساخته شده این تماس. 123 00:05:37,670 --> 00:05:39,400 چند قاب بیش از در بالای گرفت. 124 00:05:39,400 --> 00:05:41,890 در حال حاضر تماس در بالای پشته است. 125 00:05:41,890 --> 00:05:43,450 این قاب فعال است. 126 00:05:43,450 --> 00:05:47,810 بنابراین اصلی کردم ارزش 120 از فاکتوریل 5. 127 00:05:47,810 --> 00:05:50,750 این شده است در انتظار نسخه قابل چاپ کردن که ارزش. 128 00:05:50,750 --> 00:05:51,657 و سپس آن را انجام داده است. 129 00:05:51,657 --> 00:05:53,240 هیچ خط از کد را در اصلی وجود دارد. 130 00:05:53,240 --> 00:05:56,800 بنابراین قاب اصلی را بالا میآید کردن پشته، و ما در حال انجام است. 131 00:05:56,800 --> 00:05:58,992 >> و این که چگونه بازگشتی کار می کند. 132 00:05:58,992 --> 00:06:00,200 این که چگونه قاب پشته کار می کنند. 133 00:06:00,200 --> 00:06:03,120 کسانی که خواستار عملکرد که قبلا اتفاق افتاده 134 00:06:03,120 --> 00:06:06,620 فقط در مکث، انتظار برای تماس های بعدی 135 00:06:06,620 --> 00:06:12,050 را به پایان برساند به طوری که آنها می توانید فعال شوند قاب و پایان آنچه را که آنها باید انجام دهید. 136 00:06:12,050 --> 00:06:13,060 >> من داگ لوید هستم. 137 00:06:13,060 --> 00:06:14,880 این CS50 است. 138 00:06:14,880 --> 00:06:16,580