داگ لوید: اگر شما را دیده ام ویدئو در بازگشت، کل فرایند ممکن است به نظر می رسید کمی جادویی. چگونه کار می کند؟ چگونه توابع می دانیم که آنها نیاز به صبر و صبر کنید برای یکی دیگر از ارزش به بازگشت از یک تابع های مختلف پاسخ به منظور رسیدن به نتیجه ما می خواهیم؟ خوب، دلیل این کار این است به دلیل از چیزی شناخته شده به عنوان پاسخ پشته. هنگامی که شما یک تابع تماس، سیستم مجموعه کنار فضا در حافظه برای آن تابع به کار آن است. و ما این تکه از حافظه که پاسخ در حال کنار گذاشته برای هر تابع مجموعه یک قاب پشته و یا یک قاب تابع. و همانطور که انتظار می رود، این قاب پشته در بخشی از حافظه پشته زندگی می کنند. 

بیش از یک تابع قاب پشته می توانید در حافظه در یک زمان معین وجود داشته باشد. اگر خواستار یک حرکت اصلی تابع، و حرکت می نامد جهت، هر سه توابع دارای قاب باز است. اما آنها فریم فعال است همه. این قاب ها در یک پشته مرتب شده اند. و قاب از اخیرا به نام تابع است که همیشه در بالای پشته. و این کار همیشه قاب فعال است. فقط واقعا تا کنون کسی وجود تابع است که فعال در یک زمان. این یکی در بالای پشته است. 

هنگامی که یک تابع دیگر خواستار تابع، آن نوع از پرس مکث. این نوع از است در انتظار، در انتظار است. و قاب پشته دیگری تحت فشار قرار دادند بر روی پشته در بالای آن. و قاب فعال می شود. و قاب بلافاصله در زیر آن نیاز به صبر تا زمانی که دوباره قاب فعال قبل از آن می توانید کار خود را از سر گرفت. زمانی که یک تابع است کامل و آن را انجام داده، قاب آن است از پشته. که اصطلاحات است. و قاب بلافاصله در زیر آن، همانطور که گفتم، قاب جدید فعال شود. 

و اگر آن را تابع دیگر را خواند، آن را به مکث دوباره. قاب پشته که تابع نو توان بر روی بالای پشته قرار. کار خود را انجام دهد. این ممکن است خاموش پاپ. و تابع دیگر زیر آن را دوباره می توانید از سر گرفت. 

بنابراین اجازه دهید از طریق این دوباره، به دنبال در این ایده از تابع فاکتوریل که ما در تعریف فیلم بازگشتی به دیدن دقیقا چگونه سحر و جادو در پشت این روند بازگشتی در حال وقوع است. بنابراین این فایل کامل است، درست است؟ ما دو تعریف functions-- اصلی و واقعیت است. و همانطور که ما ممکن است انتظار، هر برنامه C است که در خط اول اصلی شروع می شود. 

بنابراین ما یک قاب پشته جدید برای اصلی ایجاد کنید. و آن را برای شروع در حال اجرا. تماس اصلی printf است. و تابع () printf است که به نسخه قابل چاپ کردن فاکتوریل 5. خوب، آن را نمی داند چه عاملی 5، و بنابراین این پاسخ در حال حاضر بسته به یکی دیگر از فراخوانی تابع است. بنابراین اصلی است که به مکث سمت راست وجود دارد. من میخوام ترک هستم آن فلش سمت راست وجود دارد، رنگ آن همان رنگ به عنوان پشته قاب در سمت راست، نشان می دهد که اصلی است که به یخ اینجا در حالی که فاکتوریل 5 نامیده می شود. 

بنابراین فاکتوریل 5 نامیده می شود. و آن را برای شروع در بسیار آغاز از تابع فاکتوریل. آن را می پرسد سوال من برابر با 1. است 5-1 برابر است؟ خب نه. طوری که آن را به پایین به دیگری بخشی، بازگشت n بار فاکتوریل n منهای 1. خب باشه. 

بنابراین در حال حاضر، فاکتوریل از 5 است بسته به تماس دیگر به فاکتوریل، عبور در 4 عنوان پارامتر. و به این ترتیب فاکتوریل 5 قاب، قاب که قرمز، در حال رفتن به سمت راست وجود دارد منجمد که در آن خط نشان دادم و منتظر فاکتوریل 4 به پایان برساند آنچه در آن نیاز به انجام این کار است که پس از آن می توانید قاب را دوباره فعال می شود. 

بنابراین از 4 شروع می شود فاکتوریل در آغاز فاکتوریل. است 4-1 برابر است؟ نه، تا آن را به انجام همان چیزی. آن را به پایین شاخه دیگری. آن را برای رسیدن به آن خط از کد. خوب، من قصد دارم به بازگشت چهار بار. اوه، فاکتوریل 3-- پس از فاکتوریل 4 بستگی به عاملی 3 به پایان رساندن. 

و پس از آن نیاز به فاکتوریل 3 پاسخ. و که میخوام از طریق رفتن این فرآیند را دوباره همان. این شروع می شود از طریق، می شود در اینجا. عاملی بستگی دارد 3 در فاکتوریل، از مجموع 1 بنابراین فاکتوریل 2 شروع می شود، می شود در اینجا. آن را بر روی فاکتوریل 1 بستگی دارد. عاملی 1 شروع می شود. 

باشه. بنابراین در حال حاضر، ما در حال گرفتن جایی جالب، درست است؟ بنابراین در حال حاضر، از 1 به 1 برابر است. و بنابراین ما بازگشت 1. در این مرحله، ما در حال بازگشت. تابع انجام می شود. رفتار آن را is-- وجود دارد هیچ چیز دیگری برای آن را به انجام، و به همین ترتیب قاب پشته برای فاکتوریل 1 میآید کردن. تمام شد. این بازگشت 1. و در حال حاضر، فاکتوریل 2، که قاب بلافاصله در زیر آن بود در پشته، قاب فعال می شود. 

و آن را می توانید انتخاب کنید دقیقا همان جایی که آن را ترک کردن. این شده است که در انتظار یک فاکتوریل از 1 به پایان کار آن است. این در حال حاضر به پایان رسید. و بنابراین در اینجا ما می باشد. 

عاملی 1 مقدار 1 بازگشت. بنابراین فاکتوریل 2 را می بگو 2 بار 1 بازگشت. کار خود را در حال حاضر انجام شده است. آن را بازگشت به فاکتوریل 2 3، که در انتظار بود برای آن است. عاملی 3 در حال حاضر قاب بالا، قاب فعال در پشته. و پس از آن می گوید، خوب، خوب، من قصد دارم به بازگشت 3 بار 2 است، که 6. و من قصد دارم به من بدهید که ارزش برگشت به فاکتوریل از 4، است که انتظار برای من. من انجام می شود. عاملی 3 میآید را از پشته، و فاکتوریل 4 در حال حاضر قاب فعال است. 

4 می گوید: خوب، من قصد دارم به بازگشت 4 بار فاکتوریل 3، که شش سال داشت. که از ارزش این بود که فاکتوریل 3 بازگشت. و به این ترتیب 4 بار 6 24 است. و من قصد دارم به تصویب که به فاکتوریل از 5، است که انتظار برای من. عاملی 5 در حال حاضر قاب فعال است. آن را به بازگشت 5 بار فاکتوریل 4-- 5 بار 24 یا 120-- و که ارزش برگشت به بخش اصلی است، که شده است در انتظار بسیار با صبر و حوصله برای مدت زمان طولانی در پایین پشته. 

آن را که در آن آغاز شده است. از آن ساخته شده این تماس. چند قاب بیش از در بالای گرفت. در حال حاضر تماس در بالای پشته است. این قاب فعال است. بنابراین اصلی کردم ارزش 120 از فاکتوریل 5. این شده است در انتظار نسخه قابل چاپ کردن که ارزش. و سپس آن را انجام داده است. هیچ خط از کد را در اصلی وجود دارد. بنابراین قاب اصلی را بالا میآید کردن پشته، و ما در حال انجام است. 

و این که چگونه بازگشتی کار می کند. این که چگونه قاب پشته کار می کنند. کسانی که خواستار عملکرد که قبلا اتفاق افتاده فقط در مکث، انتظار برای تماس های بعدی را به پایان برساند به طوری که آنها می توانید فعال شوند قاب و پایان آنچه را که آنها باید انجام دهید. 

من داگ لوید هستم. این CS50 است.