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 メインは関数moveを呼び出す場合、 そして動きは方向を呼び出し、 17 00:00:51,240 --> 00:00:54,460 すべての3つの機能は、オープンフレームを持っています。 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 これは、スタックの一番上の1つです。 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 我々は2つ​​の定義されました 主事実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に等しい質問AMを尋ねますか? 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 OK、まあ。 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 [OK]を、私は4回を返すつもりです。 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 >> OK。 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 そしてそれは[OK]を、よく、私は行くよ、と言い 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 [OK]を、私は4回を返すつもりだ、と言います 6歳の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