1 00:00:00,000 --> 00:00:07,800 2 00:00:07,800 --> 00:00:10,190 >> ZAMYLA: به منظور درک بازگشت، شما باید 3 00:00:10,190 --> 00:00:13,820 اولین بازگشت را درک کنید. 4 00:00:13,820 --> 00:00:17,280 پس از بازگشت در برنامه به معنای طراحی که شما خود ارجاعی 5 00:00:17,280 --> 00:00:18,570 تعاریف. 6 00:00:18,570 --> 00:00:21,520 ساختمان داده بازگشتی، به عنوان مثال، ساختمان های داده که 7 00:00:21,520 --> 00:00:23,990 شامل خود را در تعاریف خود را. 8 00:00:23,990 --> 00:00:27,160 اما امروز، ما قصد داریم به تمرکز در توابع بازگشتی. 9 00:00:27,160 --> 00:00:31,160 >> به یاد بیاورید که توابع ورودی، استدلال، و بازگشت به ارزش به خود 10 00:00:31,160 --> 00:00:34,480 خروجی ارائه شده توسط این دیاگرام در اینجا. 11 00:00:34,480 --> 00:00:38,060 ما از جعبه به عنوان بدن از فکر می کنم تابع، شامل مجموعه ای از 12 00:00:38,060 --> 00:00:42,340 دستورالعمل ها است که تفسیر ورودی و ارائه یک خروجی. 13 00:00:42,340 --> 00:00:45,660 با توجه به بررسی دقیق تر در داخل بدن تابع می تواند تماس را نشان می دهد 14 00:00:45,660 --> 00:00:47,430 توابع دیگر نیز هست. 15 00:00:47,430 --> 00:00:51,300 از این تابع ساده، تولی، که طول می کشد یک رشته واحد به عنوان ورودی و 16 00:00:51,300 --> 00:00:54,630 چگونه نامه های بسیاری از چاپ که رشته است. 17 00:00:54,630 --> 00:00:58,490 strlen تابع، طول رشته، نامیده می شود، که خروجی است 18 00:00:58,490 --> 00:01:01,890 مورد نیاز برای فراخوانی چون printf. 19 00:01:01,890 --> 00:01:05,770 >> در حال حاضر، چه چیزی باعث می شود یک تابع بازگشتی ویژه ای است که آن را به خود فرا می خواند. 20 00:01:05,770 --> 00:01:09,610 ما می توانیم این بازگشتی نشان دهنده تماس با این رنگ نارنجی فلش 21 00:01:09,610 --> 00:01:11,360 حلقه برگشت به خود را. 22 00:01:11,360 --> 00:01:15,630 اما دوباره اجرای خود را تنها را یکی دیگر از تماس بازگشتی، و 23 00:01:15,630 --> 00:01:17,150 دیگر و دیگر. 24 00:01:17,150 --> 00:01:19,100 اما توابع بازگشتی نمی توان بی نهایت. 25 00:01:19,100 --> 00:01:23,490 آنها برای پایان دادن به نحوی، یا خود را برنامه برای همیشه اجرا خواهد شد. 26 00:01:23,490 --> 00:01:27,680 >> بنابراین ما نیاز به پیدا کردن یک راه برای شکستن از تماس های بازگشتی. 27 00:01:27,680 --> 00:01:29,900 به این مورد پایه. 28 00:01:29,900 --> 00:01:33,570 هنگامی که شرایط مورد پایه داشته است تابع بدون گرداند 29 00:01:33,570 --> 00:01:34,950 یکی دیگر از تماس بازگشتی. 30 00:01:34,950 --> 00:01:39,610 نگاهی به این تابع، سلام، تابعی از درجه اعتبار ساقط است که یک نفر بین المللی به عنوان ورودی می باشد. 31 00:01:39,610 --> 00:01:41,260 مورد پایه می آید برای اولین بار. 32 00:01:41,260 --> 00:01:46,220 اگر نفر کمتر از صفر، خداحافظ چاپ و است بازگشت به تمام موارد دیگر، 33 00:01:46,220 --> 00:01:49,400 تابع چاپ سلام و اجرا تماس بازگشتی. 34 00:01:49,400 --> 00:01:53,600 تماس دیگر به سلام تابع با یک مقدار ورودی decremented. 35 00:01:53,600 --> 00:01:56,790 >> در حال حاضر، حتی اگر ما چاپ سلام، تابع نمی خاتمه تا زمانی که ما 36 00:01:56,790 --> 00:02:00,370 بازگشت نوع بازگشت آن، در این مورد از درجه اعتبار ساقط. 37 00:02:00,370 --> 00:02:04,830 بنابراین برای هر نفر به غیر از مورد پایه، این تابع سلام باز خواهد گشت سلام 38 00:02:04,830 --> 00:02:06,890 از n منهای 1. 39 00:02:06,890 --> 00:02:10,050 از آنجا که این تابع از درجه اعتبار ساقط است هر چند، ما نه به صراحت در اینجا بازگشت تایپ کنید. 40 00:02:10,050 --> 00:02:12,000 ما فقط اجرای تابع. 41 00:02:12,000 --> 00:02:16,960 بنابراین خواستار سلام (3) خواهد شد و چاپ سلام اجرا سلام (2) است که اجرا سلام (1) یک 42 00:02:16,960 --> 00:02:20,560 است که اجرا سلام (0)، که در آن شرایط مورد پایه داشته است. 43 00:02:20,560 --> 00:02:24,100 پس سلام (0) چاپ خداحافظی و برمی گردد. 44 00:02:24,100 --> 00:02:24,990 >> OK. 45 00:02:24,990 --> 00:02:28,690 بنابراین در حال حاضر که ما درک اصول اولیه توابع بازگشتی، که آنها نیاز به 46 00:02:28,690 --> 00:02:32,730 حداقل یک مورد پایه و همچنین به عنوان یک تماس بازگشتی، اجازه دهید تا به حرکت 47 00:02:32,730 --> 00:02:34,120 به عنوان مثال معنی دار تر. 48 00:02:34,120 --> 00:02:37,830 یکی می کند که نه تنها بازگشت از درجه اعتبار ساقط بدون توجه به آنچه. 49 00:02:37,830 --> 00:02:41,340 >> اجازه دهید نگاهی به فاکتوریل عملیات اغلب در مورد استفاده 50 00:02:41,340 --> 00:02:43,660 محاسبات احتمال. 51 00:02:43,660 --> 00:02:48,120 n فاکتوریل n محصول هر است عدد صحیح مثبت کمتر از 52 00:02:48,120 --> 00:02:49,400 و به n برابر است. 53 00:02:49,400 --> 00:02:56,731 پنج بنابراین فاکتوریل 5 بار 4 بار است 3 بار 2 برابر 1 به 120. 54 00:02:56,731 --> 00:03:01,400 چهار فاکتوریل 4 بار در 3 برابر است 2 بار 1 به 24. 55 00:03:01,400 --> 00:03:04,910 و همین قاعده در مورد به هر عدد صحیح مثبت است. 56 00:03:04,910 --> 00:03:08,670 >> پس چگونه ممکن است ما ارسال بازگشتی تابع محاسبه فاکتوریل 57 00:03:08,670 --> 00:03:09,960 از تعداد؟ 58 00:03:09,960 --> 00:03:14,700 خب، ما نیاز به شناسایی هر دو مورد پایه و تماس بازگشتی. 59 00:03:14,700 --> 00:03:18,250 تماس بازگشتی خواهد بود در همه موارد به جز پایه 60 00:03:18,250 --> 00:03:21,420 مورد، به این معنی که ما به پیدا کردن یک الگو است که ما را ما 61 00:03:21,420 --> 00:03:23,350 نتیجه مورد نظر. 62 00:03:23,350 --> 00:03:30,270 >> برای این مثال، ببینید که چگونه 5 فاکتوریل شامل ضرب 4 3 2 1 63 00:03:30,270 --> 00:03:33,010 و این ضرب همان در اینجا یافت می شود، 64 00:03:33,010 --> 00:03:35,430 تعریف 4 فاکتوریل. 65 00:03:35,430 --> 00:03:39,810 بنابراین ما می بینیم که 5 فاکتوریل است فقط 5 بار 4 فاکتوریل. 66 00:03:39,810 --> 00:03:43,360 در حال حاضر این الگوی اعمال می شود 4 فاکتوریل و همچنین؟ 67 00:03:43,360 --> 00:03:44,280 بله. 68 00:03:44,280 --> 00:03:49,120 ما می بینیم که 4 عامل شامل ضرب 3 بار در 2 زمان 1، 69 00:03:49,120 --> 00:03:51,590 همان تعریف به عنوان 3 فاکتوریل. 70 00:03:51,590 --> 00:03:56,950 بنابراین 4 فاکتوریل تا 4 بار در 3 برابر است با فاکتوریل، و غیره و غیره ما 71 00:03:56,950 --> 00:04:02,170 الگوی میله های تا 1 فاکتوریل، که طبق تعریف برابر است با 1. 72 00:04:02,170 --> 00:04:04,950 >> هیچ مثبت وجود دارد اعداد صحیح باقی مانده است. 73 00:04:04,950 --> 00:04:07,870 بنابراین ما باید الگوی برای تماس بازگشتی است. 74 00:04:07,870 --> 00:04:13,260 N فاکتوریل به بار N برابر است با n فاکتوریل n منهای 1. 75 00:04:13,260 --> 00:04:14,370 و مورد پایگاه ما؟ 76 00:04:14,370 --> 00:04:17,370 که فقط تعریف ما باشد از 1 فاکتوریل. 77 00:04:17,370 --> 00:04:19,995 >> بنابراین در حال حاضر ما می توانیم به نوشتن حرکت کد برای تابع. 78 00:04:19,995 --> 00:04:24,110 برای مورد پایه، ما باید شرایط N برابر است با برابر 1، که در آن 79 00:04:24,110 --> 00:04:25,780 ما 1 را بازگشت. 80 00:04:25,780 --> 00:04:29,280 سپس حرکت بر روی تماس بازگشتی، ما بار نفر را بازگشت 81 00:04:29,280 --> 00:04:32,180 n فاکتوریل n منهای 1. 82 00:04:32,180 --> 00:04:33,590 >> در حال حاضر این ما را تست کنید. 83 00:04:33,590 --> 00:04:35,900 اجازه دهید فاکتوریل 4 امتحان کنید. 84 00:04:35,900 --> 00:04:39,420 در طول عملکرد ما آن را برابر تا 4 برابر فاکتوریل (3). 85 00:04:39,420 --> 00:04:43,040 فاکتوریل (3) برابر است با 3 بار فاکتوریل (2). 86 00:04:43,040 --> 00:04:48,700 فاکتوریل (2) به 2 بار برابر است با فاکتوریل (1)، که می گرداند 1. 87 00:04:48,700 --> 00:04:52,490 فاکتوریل (2) در حال حاضر 2 بار در 1، 2 گرداند. 88 00:04:52,490 --> 00:04:55,960 فاکتوریل (3) هم اکنون می توانید بازگشت 3 بار در 2، 6. 89 00:04:55,960 --> 00:05:02,490 و در نهایت، فاکتوریل (4) 4 بار 6، 24 باز می گردد. 90 00:05:02,490 --> 00:05:06,780 >> اگر شما در مواجهه با هر گونه مشکل با تماس بازگشتی، وانمود 91 00:05:06,780 --> 00:05:09,660 تابع کار می کند در حال حاضر. 92 00:05:09,660 --> 00:05:13,450 من از این به این معنی است که شما باید اعتماد تماس های بازگشتی خود را به بازگشت 93 00:05:13,450 --> 00:05:15,100 مقادیر سمت راست. 94 00:05:15,100 --> 00:05:18,960 برای مثال، اگر من می دانم که فاکتوریل (5) برابر با 5 بار 95 00:05:18,960 --> 00:05:24,870 فاکتوریل (4)، من قصد دارم به اعتماد که فاکتوریل (4) به من 24 داد. 96 00:05:24,870 --> 00:05:28,510 فکر می کنم از آن را به عنوان یک متغیر، اگر شما خواهد شد، به عنوان اگر شما از قبل تعریف شده 97 00:05:28,510 --> 00:05:30,070 فاکتوریل (4). 98 00:05:30,070 --> 00:05:33,850 بنابراین برای هر فاکتوریل (N)، آن را محصول n و 99 00:05:33,850 --> 00:05:35,360 فاکتوریل قبلی. 100 00:05:35,360 --> 00:05:38,130 و این عاملی قبلی است با تماس دست آمده 101 00:05:38,130 --> 00:05:41,330 n فاکتوریل n منهای 1. 102 00:05:41,330 --> 00:05:45,130 >> در حال حاضر، اگر شما می توانید پیاده سازی یک بازگشتی خود را عمل می کنند. 103 00:05:45,130 --> 00:05:50,490 بار کردن ترمینال خود را، و یا run.cs50.net، و ارسال مبلغ تابع 104 00:05:50,490 --> 00:05:54,770 است که یک نفر صحیح و برمی گرداند مجموع همه متوالی مثبت 105 00:05:54,770 --> 00:05:57,490 اعداد صحیح از N به 1. 106 00:05:57,490 --> 00:06:01,000 من نوشته ام از این مبالغ به برخی از ارزش ها به شما کمک کند ما. 107 00:06:01,000 --> 00:06:04,030 اول، شکل از شرایط مورد پایه. 108 00:06:04,030 --> 00:06:06,170 سپس، در مجموع نگاه (5). 109 00:06:06,170 --> 00:06:09,270 آیا می توانید آن را بیان در شرایط از مجموع دیگر؟ 110 00:06:09,270 --> 00:06:11,290 در حال حاضر، آنچه در مورد مبلغ (4)؟ 111 00:06:11,290 --> 00:06:15,630 چگونه می تواند به شما ابراز مجموع (4) از نظر جمع دیگر؟ 112 00:06:15,630 --> 00:06:19,655 >> هنگامی که شما جمع (5) و مجموع (4) بیان شده در شرایط دیگر مبالغ، نگاه کنید به 113 00:06:19,655 --> 00:06:22,970 اگر شما می توانید شناسایی الگوی برای مجموع (n) است. 114 00:06:22,970 --> 00:06:26,190 اگر نه، سعی کنید چند شماره های دیگر و بیان مبالغ خود را در 115 00:06:26,190 --> 00:06:28,410 از لحاظ تعداد دیگری. 116 00:06:28,410 --> 00:06:31,930 با شناسایی الگوهای برای گسسته اعداد، شما را به خوبی در راه خود را به هستی 117 00:06:31,930 --> 00:06:34,320 شناسایی الگوی برای هر نفر. 118 00:06:34,320 --> 00:06:38,040 >> بازگشت به یک ابزار واقعا قدرتمند است، پس از دوره آن را نه محدود به 119 00:06:38,040 --> 00:06:39,820 توابع ریاضی. 120 00:06:39,820 --> 00:06:44,040 بازگشت می تواند مورد استفاده قرار گیرد بسیار موثر در هنگام برخورد با درختان به عنوان مثال. 121 00:06:44,040 --> 00:06:47,210 اتمام کوتاه در درختان برای تر بررسی دقیق، اما در حال حاضر 122 00:06:47,210 --> 00:06:51,140 به یاد آورید که درخت جستجوی دودویی، در خاص، هستند تا از گره ها ساخته شده، هر 123 00:06:51,140 --> 00:06:53,820 با ارزش و دو اشاره گر به گره. 124 00:06:53,820 --> 00:06:57,270 معمولا، این است که نشان داده شده است گره پدر داشتن یک خط اشاره 125 00:06:57,270 --> 00:07:01,870 به گره فرزند چپ و یک به گره فرزند سمت راست. 126 00:07:01,870 --> 00:07:04,510 ساختار یک جستجوی دودویی درخت خود را به خوبی آشنایی 127 00:07:04,510 --> 00:07:05,940 به یک جستجو بازگشتی. 128 00:07:05,940 --> 00:07:09,730 تماس بازگشتی یا در عبور چپ یا گره سمت راست، اما بیشتر 129 00:07:09,730 --> 00:07:10,950 که در کوتاه درخت. 130 00:07:10,950 --> 00:07:15,690 >> می گویند شما می خواهید برای انجام یک عمل جراحی در هر گره در درخت جستجوی دودویی. 131 00:07:15,690 --> 00:07:17,410 چگونه ممکن است به شما در مورد آن برود؟ 132 00:07:17,410 --> 00:07:20,600 خوب، شما می توانید از بازگشتی ارسال تابع است که انجام عملیات 133 00:07:20,600 --> 00:07:24,450 در گره پدر است و باعث می شود یک بازگشتی تماس بگیرید به همان تابع، 134 00:07:24,450 --> 00:07:27,630 عبور از در سمت چپ و گره فرزند سمت راست. 135 00:07:27,630 --> 00:07:31,650 به عنوان مثال، این تابع، تولی، که تغییر ارزش یک گره داده شده و 136 00:07:31,650 --> 00:07:33,830 همه فرزندان خود را به 1. 137 00:07:33,830 --> 00:07:37,400 مورد پایه از علل گره تهی تابع به بازگشت، نشان می دهد 138 00:07:37,400 --> 00:07:41,290 که هر گره وجود دارد در سمت چپ که زیر درخت. 139 00:07:41,290 --> 00:07:42,620 >> اجازه دهید از طریق آن راه رفتن. 140 00:07:42,620 --> 00:07:44,340 برای اولین بار پدر و مادر 13 است. 141 00:07:44,340 --> 00:07:47,930 ما ارزش را تغییر دهید تا 1، و سپس تماس بگیرید عملکرد ما در سمت چپ و همچنین 142 00:07:47,930 --> 00:07:49,600 به سمت راست. 143 00:07:49,600 --> 00:07:53,910 تابع، تولی، در سمت چپ نام زیر درخت اول، تا گره سمت چپ 144 00:07:53,910 --> 00:07:57,730 خواهد شد به 1 و تولی منصوب خواهد شد بر روی کودکان که گره نامیده می شود، 145 00:07:57,730 --> 00:08:01,900 اولین سمت چپ و سپس سمت راست، و غیره و غیره. 146 00:08:01,900 --> 00:08:05,630 و به آنها بگویید که شاخه لازم نیست کودکان هر بیشتر از همان پروسه 147 00:08:05,630 --> 00:08:09,700 برای کودکان مناسب ادامه خواهد داد تا گره های درخت کل هستند 148 00:08:09,700 --> 00:08:11,430 دوباره به 1. 149 00:08:11,430 --> 00:08:15,390 >> همانطور که می بینید، شما محدود نشده است به تنها با یک تماس بازگشتی. 150 00:08:15,390 --> 00:08:17,930 فقط به عنوان بسیاری را دریافت خواهید کار انجام می شود. 151 00:08:17,930 --> 00:08:21,200 چه می شود اگر شما یک درخت به حال که در آن هر گره سه فرزند بود، 152 00:08:21,200 --> 00:08:23,100 چپ، وسط و راست؟ 153 00:08:23,100 --> 00:08:24,886 چگونه تولی شما را ویرایش کنم؟ 154 00:08:24,886 --> 00:08:25,860 خب، ساده است. 155 00:08:25,860 --> 00:08:30,250 فقط یک تماس بازگشتی اضافه کردن و پاس در اشاره گر به گره وسط. 156 00:08:30,250 --> 00:08:34,549 >> بازگشت بسیار قدرتمند است و به است اشاره ظریف، اما می توان آن را 157 00:08:34,549 --> 00:08:38,010 مفهوم دشوار در ابتدا، پس بیمار و وقت خود را. 158 00:08:38,010 --> 00:08:39,370 شروع با مورد پایه. 159 00:08:39,370 --> 00:08:42,650 معمولا ساده ترین راه برای شناسایی، و سپس شما می توانید کار 160 00:08:42,650 --> 00:08:43,830 به عقب وجود دارد. 161 00:08:43,830 --> 00:08:46,190 شما می دانید شما نیاز به رسیدن به خود را مورد پایه، به طوری که ممکن است 162 00:08:46,190 --> 00:08:47,760 شما چند نکات می دهد. 163 00:08:47,760 --> 00:08:53,120 سعی کنید برای بیان یک مورد خاص در از لحاظ موارد دیگر، و یا در زیر مجموعه. 164 00:08:53,120 --> 00:08:54,700 >> برای تماشای این کوتاه است. 165 00:08:54,700 --> 00:08:58,920 در دست کم، در حال حاضر شما می توانید درک جوک شبیه به این. 166 00:08:58,920 --> 00:09:01,250 نام من Zamyla است، و این cs50 است. 167 00:09:01,250 --> 00:09:04,306 168 00:09:04,306 --> 00:09:07,170 >> نگاهی به این تابع، سلام، تابع از درجه اعتبار ساقط است که طول می کشد 169 00:09:07,170 --> 00:09:09,212 یک int، n، به عنوان ورودی می باشد. 170 00:09:09,212 --> 00:09:11,020 مورد پایه می آید برای اولین بار. 171 00:09:11,020 --> 00:09:14,240 اگر نفر کمتر از 0، چاپ است "خداحافظ" و بازگشت. 172 00:09:14,240 --> 00:09:15,490