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 1과 동일한 5인가? 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 1과 동일한 4인가요? 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 그것은 하나의 요인에 따라 달라집니다. 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 그리고 그것은 확인을, 잘, 내가 갈거야,라고 6 3 회 2를 반환합니다. 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