1 00:00:00,000 --> 00:00:05,587 2 00:00:05,587 --> 00:00:07,670 DOUG LLOYD: Αν έχετε δει το βίντεο για αναδρομή, 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 Είμαι θα αφήσει τους arrow εκεί, το χρώμα 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 >> Είμαι ο Νταγκ Lloyd. 137 00:06:13,060 --> 00:06:14,880 Αυτό είναι CS50. 138 00:06:14,880 --> 00:06:16,580