1 00:00:00,000 --> 00:00:05,587 2 00:00:05,587 --> 00:00:07,670 DOUG لويد: إذا كنت قد رأيت الفيديو على العودية، 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 مضروب ن ناقص 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