1 00:00:00,000 --> 00:00:05,587 2 00:00:05,587 --> 00:00:07,670 Doug LLOYD: Eğer gördüyseniz özyineleme video, 3 00:00:07,670 --> 00:00:10,170 Tüm süreç olabilir Biraz büyülü gibiydi. 4 00:00:10,170 --> 00:00:10,930 Nasıl çalışır? 5 00:00:10,930 --> 00:00:15,010 Işlevleri nasıl olduğunu biliyor musunuz onlar bekleyin ve başka bir değere beklemenize gerek 6 00:00:15,010 --> 00:00:19,150 Farklı bir işlevden dönmek için İstediğimiz sonucu elde etmek için mi diyorsun? 7 00:00:19,150 --> 00:00:22,550 >> Peki, bu işler sebebi ise çağrı yığını olarak bilinen bir şey. 8 00:00:22,550 --> 00:00:26,360 Bir işlevini çağırdığınızda, Sistem belleğinde yer ayırmaktadır 9 00:00:26,360 --> 00:00:28,120 Bu işlev için çalışmalarını yapmak. 10 00:00:28,120 --> 00:00:31,720 Ve biz bellek bu parçalar dediğimiz Her bir fonksiyon için bir kenara ediliyor 11 00:00:31,720 --> 00:00:35,670 Bir yığın çerçeve veya bir işlev çerçeve diyoruz. 12 00:00:35,670 --> 00:00:38,290 Ve Tahmin edebileceğiniz gibi, Bu yığın çerçeveleri 13 00:00:38,290 --> 00:00:41,000 bellek yığını parçası yaşıyor. 14 00:00:41,000 --> 00:00:43,960 15 00:00:43,960 --> 00:00:47,540 >> Birden fazla fonksiyon yığın çerçevesi belirli bir anda hafızada mevcut olabilir. 16 00:00:47,540 --> 00:00:51,240 Ana bir işlev hareket çağırırsa, ve hareket yönünü çağırır, 17 00:00:51,240 --> 00:00:54,460 Her üç fonksiyon açık kare var. 18 00:00:54,460 --> 00:00:57,350 Ama aktif kareleri tüm var. 19 00:00:57,350 --> 00:00:59,410 Bu gövdeler, bir istif halinde düzenlenmiştir. 20 00:00:59,410 --> 00:01:01,820 Ve gelen çerçeve en son aranan 21 00:01:01,820 --> 00:01:04,390 Fonksiyon yığının en üstüne her zaman açıktır. 22 00:01:04,390 --> 00:01:07,150 Ve bu her zaman aktif karedir. 23 00:01:07,150 --> 00:01:10,420 Sadece gerçekten hiç bir tane var Bir anda etkin olduğunu işlevi. 24 00:01:10,420 --> 00:01:12,420 Bu yığının en üstüne biri. 25 00:01:12,420 --> 00:01:17,620 >> Ne zaman bir işlev başka çağırır fonksiyonu, bu tür duraklama bastırır. 26 00:01:17,620 --> 00:01:20,590 Bu tür bekliyor, beklemede. 27 00:01:20,590 --> 00:01:24,050 Ve başka bir yığın çerçevesi itilir bunun üstüne yığınının üzerine. 28 00:01:24,050 --> 00:01:26,150 Ve bu aktif çerçeve haline gelir. 29 00:01:26,150 --> 00:01:28,600 Ve çerçeve hemen o beklemek gerekiyor altına 30 00:01:28,600 --> 00:01:33,560 yine aktif çerçeve kadar onun işi devam etmeden önce. 31 00:01:33,560 --> 00:01:35,870 Ne zaman bir fonksiyonudur tam ve bitti, 32 00:01:35,870 --> 00:01:37,720 onun çerçeve yığını kapalı uzattı. 33 00:01:37,720 --> 00:01:38,950 Bu terminoloji. 34 00:01:38,950 --> 00:01:41,110 Ve çerçeve hemen altında, ben sadece dediğim gibi, 35 00:01:41,110 --> 00:01:42,880 Yeni aktif çerçeve haline gelir. 36 00:01:42,880 --> 00:01:45,960 >> Ve başka bir işlevini çağırırsa, tekrar duraklatmak için gidiyor. 37 00:01:45,960 --> 00:01:49,290 İşte yeni işlevin yığın çerçevesi olacak yığının en üstüne itti. 38 00:01:49,290 --> 00:01:50,650 Onun çalışma yapacağız. 39 00:01:50,650 --> 00:01:52,100 Bu kapalı geri pop olabilir. 40 00:01:52,100 --> 00:01:55,630 Ve diğer fonksiyon Aşağıda tekrar devam edebilirsiniz. 41 00:01:55,630 --> 00:02:00,080 >> Yani görünümlü, yine bu yolla gidelim faktöriyel fonksiyonunun fikri 42 00:02:00,080 --> 00:02:03,070 Biz tanımlanan yineleme Video görmek için 43 00:02:03,070 --> 00:02:07,770 tam olarak nasıl bu işin arkasında sihirli özyineli süreç yaşanıyor. 44 00:02:07,770 --> 00:02:09,870 Yani bu bizim tüm dosya, değil mi? 45 00:02:09,870 --> 00:02:14,000 Biz iki tanımlanmış Ana ve aslında functions--. 46 00:02:14,000 --> 00:02:15,980 Ve biz beklediğiniz gibi, Herhangi bir C programı gidiyor 47 00:02:15,980 --> 00:02:18,470 Ana birinci satırında başlatın. 48 00:02:18,470 --> 00:02:21,660 >> Bu yüzden ana için yeni bir yığın çerçevesi oluşturun. 49 00:02:21,660 --> 00:02:23,320 Ve yayınlanmaya başlaması için gidiyor. 50 00:02:23,320 --> 00:02:25,270 Ana aramalar printf. 51 00:02:25,270 --> 00:02:29,390 Ve printf gidiyor 5 faktoriyelini çıktı. 52 00:02:29,390 --> 00:02:31,440 Peki, bilmiyor 5 Ne faktöryel olduğunu 53 00:02:31,440 --> 00:02:35,620 ve bu nedenle bu çağrı zaten Başka bir işlev çağrısı bağlı. 54 00:02:35,620 --> 00:02:37,270 Yani ana orada duraklatmak için gidiyor. 55 00:02:37,270 --> 00:02:39,103 Ben bırakacağım onun , orada renk ok 56 00:02:39,103 --> 00:02:41,360 o aynı renk Sağdaki çerçeveyi yığını, 57 00:02:41,360 --> 00:02:47,720 Ana dondurmak için gidiyor belirtmek için 5 faktöryel denir burada iken. 58 00:02:47,720 --> 00:02:49,300 >> Yani 5 faktöryel denir. 59 00:02:49,300 --> 00:02:53,160 Ve çok başlatmak için gidiyor faktöriyel fonksiyonunun başında. 60 00:02:53,160 --> 00:02:55,440 Bu soru Ben 1 eşit am sorar? 61 00:02:55,440 --> 00:02:56,810 1'e eşit 5 mi? 62 00:02:56,810 --> 00:02:57,410 Hayır. 63 00:02:57,410 --> 00:03:01,110 Yani aşağı gidecek Başka kısmı iade n kere 64 00:03:01,110 --> 00:03:02,990 n eksi 1 faktöryel. 65 00:03:02,990 --> 00:03:03,490 İyi tamam. 66 00:03:03,490 --> 00:03:07,070 >> Yani şimdi, 5 faktöryel olan Başka bir çağrı bağlı 67 00:03:07,070 --> 00:03:09,740 geçen faktöryel için parametresi olarak 4'de. 68 00:03:09,740 --> 00:03:14,210 Ve böylece faktöryel arasında 5 çerçeve, kırmızı çerçeve o, 69 00:03:14,210 --> 00:03:17,160 Orada dondurmak için gidiyor Bu çizginin ben belitmişsin 70 00:03:17,160 --> 00:03:21,914 ve bitirmek için 4 faktöriyele bekleyin o zaman ki bunu yapmak için ihtiyaç duyduğu 71 00:03:21,914 --> 00:03:23,330 Aktif Frame tekrar olabilir. 72 00:03:23,330 --> 00:03:26,890 >> Yani 4 başlar faktöryel faktöryel başlangıcı. 73 00:03:26,890 --> 00:03:28,556 1'e eşit 4 midir? 74 00:03:28,556 --> 00:03:30,180 Hayır, bu yüzden aynı şeyi yapmak için gidiyor. 75 00:03:30,180 --> 00:03:31,590 Bu başka şube aşağı gidecek. 76 00:03:31,590 --> 00:03:33,240 Bu kod satırı almak için gidiyor. 77 00:03:33,240 --> 00:03:35,710 Tamam, ben dört kez geri gidiyorum. 78 00:03:35,710 --> 00:03:41,270 Ah, 3-- faktör yani faktöryel 4 3 terbiye faktöriyele bağlıdır. 79 00:03:41,270 --> 00:03:43,055 >> Ve böylece 3 faktoriyelini aramak gerekiyor. 80 00:03:43,055 --> 00:03:45,180 Ve bu olacak geçmesi bulunuyor Yine aynı işlem. 81 00:03:45,180 --> 00:03:48,200 Bu, içinden başlar burada alır. 82 00:03:48,200 --> 00:03:50,980 3 Faktöriyel bağlıdır 1 faktöriyele üzerinde. 83 00:03:50,980 --> 00:03:53,750 2 başlar Yani faktöriyel, burada alır. 84 00:03:53,750 --> 00:03:56,310 Bu 1 faktöriyel bağlıdır. 85 00:03:56,310 --> 00:03:57,430 1 başlar Faktöriyel. 86 00:03:57,430 --> 00:03:57,650 >> TAMAM. 87 00:03:57,650 --> 00:03:59,775 Yani şimdi biz alıyoruz ilginç bir yerde, değil mi? 88 00:03:59,775 --> 00:04:02,190 Yani şimdi, 1 ila 1 eşittir. 89 00:04:02,190 --> 00:04:05,130 Ve böylece biz 1 dönmek. 90 00:04:05,130 --> 00:04:06,770 Bu noktada, biz dönüyor. 91 00:04:06,770 --> 00:04:07,880 Fonksiyon bitti. 92 00:04:07,880 --> 00:04:11,140 It davranış var bu-- bunu yapmak için başka bir şey, 93 00:04:11,140 --> 00:04:17,006 ve böylece yığın çerçevesi için 1 faktöryel kapalı açılır. 94 00:04:17,006 --> 00:04:17,589 Bitti. 95 00:04:17,589 --> 00:04:19,480 Bu 1 döndürdü. 96 00:04:19,480 --> 00:04:23,370 Ve şimdi, 2 faktöryel, hangi Çerçeve altında hemen oldu 97 00:04:23,370 --> 00:04:26,160 yığın, aktif çerçeve haline gelir. 98 00:04:26,160 --> 00:04:29,030 >> Ve o pick up Tam kaldığı yerden. 99 00:04:29,030 --> 00:04:32,240 Bir Faktöriyel bekliyor 1 çalışmalarını bitirmek için. 100 00:04:32,240 --> 00:04:33,610 Şimdi tamamladı. 101 00:04:33,610 --> 00:04:35,510 Ve böylece biz burada. 102 00:04:35,510 --> 00:04:38,080 >> 1 Faktöriyel 1 değeri döndürdü. 103 00:04:38,080 --> 00:04:42,430 2 kutu Yani faktöryel diyelim ki 2 kere 1 döndürür. 104 00:04:42,430 --> 00:04:43,680 Onun iş şimdi yapılıyor. 105 00:04:43,680 --> 00:04:49,110 Bu faktöryel için 2 döndürülür 3, bunun için bekliyordu hangi. 106 00:04:49,110 --> 00:04:53,370 3 Faktöriyel artık üst çerçeve olduğunu yığınında aktif çerçeve. 107 00:04:53,370 --> 00:04:58,617 Ve böylece Tamam, ben gidiyorum diyor 6 3 kez 2, geri dönmek için. 108 00:04:58,617 --> 00:05:00,700 Ve bunu vereceğim faktöriyel geri değer 109 00:05:00,700 --> 00:05:03,430 4, beni bekliyordu edilmiş olan. 110 00:05:03,430 --> 00:05:04,500 Bitirdim. 111 00:05:04,500 --> 00:05:09,410 3 Faktöriyel yığınını kapalı açılır ve 4 faktöryel artık aktif karedir. 112 00:05:09,410 --> 00:05:13,510 >> 4 Tamam, 4 kez geri gidiyorum diyor altı yaşındayken 3 faktörlü. 113 00:05:13,510 --> 00:05:15,980 Bu değer olduğu 3 faktöryel döndü. 114 00:05:15,980 --> 00:05:19,010 Ve böylece 4 kez 6 24 olduğunu. 115 00:05:19,010 --> 00:05:20,990 Ve ben geçmek gidiyorum Bu geri faktöryel için 116 00:05:20,990 --> 00:05:23,160 5, beni bekliyordu edilmiş olan. 117 00:05:23,160 --> 00:05:25,270 5 Faktöriyel artık aktif karedir. 118 00:05:25,270 --> 00:05:30,700 Bu 5 kez geri gidiyor 4-- 5 kez 24 ya da 120-- faktör 119 00:05:30,700 --> 00:05:32,722 ve bu değer vermek Geri sahip olan ana kadar 120 00:05:32,722 --> 00:05:35,680 Bir çok sabırla bekliyor yığının altındaki uzun zaman. 121 00:05:35,680 --> 00:05:36,640 >> Başladığı yer. 122 00:05:36,640 --> 00:05:37,670 Bu çağrı yaptı. 123 00:05:37,670 --> 00:05:39,400 Birkaç kare üstünde devraldı. 124 00:05:39,400 --> 00:05:41,890 Şimdi geri yığının üstünde olduğunu. 125 00:05:41,890 --> 00:05:43,450 Aktif çerçeve var. 126 00:05:43,450 --> 00:05:47,810 Yani ana değer var 120 Geri 5 faktöriyel itibaren. 127 00:05:47,810 --> 00:05:50,750 Bu kadar bekliyor Bu değer çıktı. 128 00:05:50,750 --> 00:05:51,657 Ve sonra bitti. 129 00:05:51,657 --> 00:05:53,240 Ana kod daha satırları var. 130 00:05:53,240 --> 00:05:56,800 Yani ana çerçevesi kapalı açılan Yığın ve biz bitirdik. 131 00:05:56,800 --> 00:05:58,992 >> Özyineleme nasıl çalıştığını Ve işte. 132 00:05:58,992 --> 00:06:00,200 Bu yığın çerçeveleri işe nasıl. 133 00:06:00,200 --> 00:06:03,120 Bu işlev çağrıları daha önce ne 134 00:06:03,120 --> 00:06:06,620 sadece duraklama vardır bekliyor sonraki çağrılar için 135 00:06:06,620 --> 00:06:12,050 böylece aktif hale gelebilir bitirmek çerçeve ve yapmaları gerekenleri bitirmek. 136 00:06:12,050 --> 00:06:13,060 >> Ben Doug Lloyd değilim. 137 00:06:13,060 --> 00:06:14,880 Bu CS50 olduğunu. 138 00:06:14,880 --> 00:06:16,580