1 00:00:00,000 --> 00:00:05,860 >> [MUSIC PLAYING] 2 00:00:05,860 --> 00:00:09,530 >> Doug LLOYD: Anda mungkin berpikir bahwa Kode hanya digunakan untuk menyelesaikan tugas. 3 00:00:09,530 --> 00:00:10,450 Anda menulis itu. 4 00:00:10,450 --> 00:00:11,664 Itu melakukan sesuatu. 5 00:00:11,664 --> 00:00:12,580 Itu cukup banyak itu. 6 00:00:12,580 --> 00:00:13,160 >> Anda compile. 7 00:00:13,160 --> 00:00:13,993 Anda menjalankan program. 8 00:00:13,993 --> 00:00:15,370 Anda baik untuk pergi. 9 00:00:15,370 --> 00:00:17,520 >> Tapi percaya atau tidak, jika Anda kode untuk waktu yang lama, 10 00:00:17,520 --> 00:00:20,550 Anda benar-benar mungkin datang untuk melihat kode sebagai sesuatu yang indah. 11 00:00:20,550 --> 00:00:23,275 Ini memecahkan masalah di cara yang sangat menarik, 12 00:00:23,275 --> 00:00:26,510 atau ada sesuatu yang benar-benar rapi tentang cara terlihat. 13 00:00:26,510 --> 00:00:28,750 Anda mungkin akan tertawa pada saya, tapi itu benar. 14 00:00:28,750 --> 00:00:31,530 Dan rekursi adalah salah satu cara untuk semacam mendapatkan ide ini 15 00:00:31,530 --> 00:00:34,090 indah, elegan tampak kode. 16 00:00:34,090 --> 00:00:37,740 Ini memecahkan masalah dengan cara yang menarik, mudah untuk memvisualisasikan, 17 00:00:37,740 --> 00:00:39,810 dan sangat singkat. 18 00:00:39,810 --> 00:00:43,190 >> Karya-karya cara rekursi adalah, fungsi rekursif 19 00:00:43,190 --> 00:00:49,291 didefinisikan sebagai fungsi yang memanggil dirinya sebagai bagian dari pelaksanaannya. 20 00:00:49,291 --> 00:00:51,790 Yang mungkin tampak sedikit aneh, dan kita akan melihat sedikit 21 00:00:51,790 --> 00:00:53,750 tentang bagaimana ini bekerja dalam sekejap. 22 00:00:53,750 --> 00:00:55,560 Tapi sekali lagi, ini prosedur rekursif adalah 23 00:00:55,560 --> 00:00:57,730 akan menjadi begitu elegan karena mereka akan 24 00:00:57,730 --> 00:01:00,410 untuk memecahkan masalah ini tanpa memiliki semua fungsi lainnya 25 00:01:00,410 --> 00:01:02,710 atau ini loop panjang. 26 00:01:02,710 --> 00:01:06,310 Anda akan melihat bahwa ini rekursif prosedur akan terlihat begitu singkat. 27 00:01:06,310 --> 00:01:10,610 Dan mereka benar-benar akan membuat kode Anda terlihat jauh lebih indah. 28 00:01:10,610 --> 00:01:12,560 >> Saya akan memberikan contoh ini untuk melihat bagaimana 29 00:01:12,560 --> 00:01:14,880 prosedur rekursif dapat didefinisikan. 30 00:01:14,880 --> 00:01:18,202 Jadi jika Anda terbiasa dengan ini dari kelas matematika bertahun-tahun yang lalu, 31 00:01:18,202 --> 00:01:20,910 ada yang sesuatu yang disebut fungsi faktorial, yang biasanya 32 00:01:20,910 --> 00:01:25,340 dilambangkan sebagai tanda seru, yang didefinisikan atas semua bilangan bulat positif. 33 00:01:25,340 --> 00:01:28,850 Dan cara yang n faktorial dihitung 34 00:01:28,850 --> 00:01:31,050 adalah Anda kalikan semua angka kurang dari 35 00:01:31,050 --> 00:01:33,750 atau sama dengan n together-- semua bilangan bulat kurang dari 36 00:01:33,750 --> 00:01:34,880 atau sama dengan n bersama-sama. 37 00:01:34,880 --> 00:01:39,850 >> Jadi 5 faktorial adalah 5 kali 4 kali 3 kali 2 kali 1. 38 00:01:39,850 --> 00:01:43,020 Dan 4 faktorial adalah 4 kali 3 kali 2 kali 1 dan seterusnya. 39 00:01:43,020 --> 00:01:44,800 Anda mendapatkan ide. 40 00:01:44,800 --> 00:01:47,060 >> Sebagai programmer, kita tidak menggunakan n, tanda seru. 41 00:01:47,060 --> 00:01:51,840 Jadi kita akan menentukan faktorial berfungsi sebagai fakta n. 42 00:01:51,840 --> 00:01:56,897 Dan kita akan menggunakan faktorial untuk membuat solusi rekursif untuk masalah. 43 00:01:56,897 --> 00:01:59,230 Dan saya pikir Anda mungkin menemukan bahwa itu jauh lebih visual 44 00:01:59,230 --> 00:02:02,380 menarik daripada berulang versi ini, yang 45 00:02:02,380 --> 00:02:05,010 kami juga akan melihat pada suatu saat. 46 00:02:05,010 --> 00:02:08,310 >> Jadi di sini adalah beberapa pun facts-- intended-- 47 00:02:08,310 --> 00:02:10,169 tentang factorial-- yang fungsi faktorial. 48 00:02:10,169 --> 00:02:13,090 Faktorial dari 1, seperti yang saya katakan, adalah 1. 49 00:02:13,090 --> 00:02:15,690 Faktorial dari 2 adalah 2 kali 1. 50 00:02:15,690 --> 00:02:18,470 Faktorial dari 3 adalah 3 kali 2 kali 1, dan sebagainya. 51 00:02:18,470 --> 00:02:20,810 Kami berbicara tentang 4 dan 5 sudah. 52 00:02:20,810 --> 00:02:23,940 >> Tapi melihat ini, bukan ini benar? 53 00:02:23,940 --> 00:02:28,220 Bukankah faktorial dari 2 hanya 2 kali faktorial dari 1? 54 00:02:28,220 --> 00:02:31,130 Maksudku, faktorial dari 1 adalah 1. 55 00:02:31,130 --> 00:02:34,940 Jadi mengapa kita tidak bisa hanya mengatakan bahwa, sejak faktorial 2 adalah 2 kali 1, 56 00:02:34,940 --> 00:02:38,520 itu benar-benar hanya 2 kali faktorial dari 1? 57 00:02:38,520 --> 00:02:40,900 >> Dan kemudian memperluas gagasan itu, tidak faktorial dari 3 58 00:02:40,900 --> 00:02:44,080 hanya 3 kali faktorial dari 2? 59 00:02:44,080 --> 00:02:50,350 Dan faktorial dari 4 adalah 4 kali faktorial dari 3, dan seterusnya? 60 00:02:50,350 --> 00:02:52,530 Bahkan, faktorial yang dari sejumlah bisa hanya 61 00:02:52,530 --> 00:02:54,660 dinyatakan jika kita jenis dari melakukan hal ini selamanya. 62 00:02:54,660 --> 00:02:56,870 Kita bisa semacam generalisasi masalah faktorial 63 00:02:56,870 --> 00:02:59,910 seperti itu n kali faktorial dari n minus 1. 64 00:02:59,910 --> 00:03:04,840 Ini n kali produk semua angka kurang dari saya. 65 00:03:04,840 --> 00:03:08,890 >> Ide ini, ini generalisasi dari masalah, 66 00:03:08,890 --> 00:03:13,410 memungkinkan kita untuk secara rekursif mendefinisikan fungsi faktorial. 67 00:03:13,410 --> 00:03:15,440 Ketika anda mendefinisikan suatu fungsi rekursif, ada 68 00:03:15,440 --> 00:03:17,470 dua hal yang perlu menjadi bagian dari itu. 69 00:03:17,470 --> 00:03:20,990 Anda harus memiliki sesuatu yang disebut kasus dasar, yang, ketika Anda memicu itu, 70 00:03:20,990 --> 00:03:22,480 akan menghentikan proses rekursif. 71 00:03:22,480 --> 00:03:25,300 >> Jika tidak, fungsi yang memanggil itself-- karena Anda mungkin imagine-- 72 00:03:25,300 --> 00:03:26,870 bisa berlangsung selamanya. 73 00:03:26,870 --> 00:03:29,047 Fungsi panggilan fungsi memanggil fungsi panggilan 74 00:03:29,047 --> 00:03:30,380 fungsi panggilan fungsi. 75 00:03:30,380 --> 00:03:32,380 Jika Anda tidak memiliki cara untuk menghentikannya, program Anda 76 00:03:32,380 --> 00:03:34,760 akan efektif terjebak di loop tak terbatas. 77 00:03:34,760 --> 00:03:37,176 Ini akan crash pada akhirnya, karena akan kehabisan memori. 78 00:03:37,176 --> 00:03:38,990 Tapi bukan itu intinya. 79 00:03:38,990 --> 00:03:42,210 >> Kita perlu memiliki beberapa cara lain untuk menghentikan hal selain menerjang program kami, 80 00:03:42,210 --> 00:03:46,010 karena program yang crash adalah mungkin tidak indah atau elegan. 81 00:03:46,010 --> 00:03:47,690 Dan jadi kita menyebutnya kasus dasar. 82 00:03:47,690 --> 00:03:50,610 Ini adalah solusi sederhana untuk masalah yang berhenti 83 00:03:50,610 --> 00:03:52,770 proses rekursif dari terjadi. 84 00:03:52,770 --> 00:03:55,220 Jadi itu salah satu bagian dari fungsi rekursif. 85 00:03:55,220 --> 00:03:56,820 >> Bagian kedua adalah kasus rekursif. 86 00:03:56,820 --> 00:03:59,195 Dan ini adalah di mana rekursi benar-benar akan terjadi. 87 00:03:59,195 --> 00:04:02,200 Di sinilah Fungsi akan memanggil dirinya sendiri. 88 00:04:02,200 --> 00:04:05,940 >> Ini tidak akan menyebut dirinya persis dengan cara yang sama itu disebut. 89 00:04:05,940 --> 00:04:08,880 Ini akan menjadi sedikit variasi yang membuat masalah itu 90 00:04:08,880 --> 00:04:11,497 mencoba untuk memecahkan mungil sedikit lebih kecil. 91 00:04:11,497 --> 00:04:14,330 Tetapi umumnya melewati buck memecahkan sebagian dari solusi 92 00:04:14,330 --> 00:04:17,450 untuk panggilan yang berbeda di telepon. 93 00:04:17,450 --> 00:04:20,290 >> Yang terlihat ini seperti kasus dasar di sini? 94 00:04:20,290 --> 00:04:25,384 Yang satu terlihat seperti ini Solusi paling sederhana untuk masalah? 95 00:04:25,384 --> 00:04:27,550 Kami memiliki banyak factorials, dan kami bisa terus 96 00:04:27,550 --> 00:04:30,470 akan on-- 6, 7, 8, 9, 10, dan seterusnya. 97 00:04:30,470 --> 00:04:34,130 >> Tapi salah satu penampilan ini seperti kasus yang baik untuk menjadi kasus dasar. 98 00:04:34,130 --> 00:04:35,310 Ini adalah solusi yang sangat sederhana. 99 00:04:35,310 --> 00:04:37,810 Kami tidak perlu melakukan sesuatu yang istimewa. 100 00:04:37,810 --> 00:04:40,560 >> Faktorial dari 1 hanya 1. 101 00:04:40,560 --> 00:04:42,790 Kami tidak perlu melakukan perkalian sama sekali. 102 00:04:42,790 --> 00:04:45,248 Sepertinya jika kita akan untuk mencoba dan memecahkan masalah ini, 103 00:04:45,248 --> 00:04:47,600 dan kita perlu menghentikan rekursi suatu tempat, 104 00:04:47,600 --> 00:04:50,610 kita mungkin ingin berhenti ketika kita sampai 1. 105 00:04:50,610 --> 00:04:54,580 Kami tidak ingin berhenti sebelum itu. 106 00:04:54,580 --> 00:04:56,660 >> Jadi jika kita mendefinisikan fungsi faktorial kami, 107 00:04:56,660 --> 00:04:58,690 inilah kerangka untuk bagaimana kita bisa melakukan itu. 108 00:04:58,690 --> 00:05:03,110 Kita perlu pasang di dua things-- kasus dasar dan kasus rekursif. 109 00:05:03,110 --> 00:05:04,990 Apa kasus dasar? 110 00:05:04,990 --> 00:05:10,150 Jika n adalah sama dengan 1, kembali 1-- itu masalah yang sangat sederhana untuk memecahkan. 111 00:05:10,150 --> 00:05:11,890 >> Faktorial dari 1 adalah 1. 112 00:05:11,890 --> 00:05:13,860 Ini bukan kali 1 apa-apa. 113 00:05:13,860 --> 00:05:15,020 Ini hanya 1. 114 00:05:15,020 --> 00:05:17,170 Ini adalah fakta yang sangat mudah. 115 00:05:17,170 --> 00:05:19,620 Dan sehingga dapat menjadi kasus basis kami. 116 00:05:19,620 --> 00:05:24,730 Jika kita bisa melewati 1 ke ini fungsi, kami hanya akan kembali 1. 117 00:05:24,730 --> 00:05:27,320 >> Apa yang rekursif kasus mungkin terlihat seperti? 118 00:05:27,320 --> 00:05:32,445 Untuk setiap nomor lain selain 1, apa pola? 119 00:05:32,445 --> 00:05:35,780 Nah, jika kita mengambil faktorial dari n, 120 00:05:35,780 --> 00:05:38,160 itu n kali faktorial dari n minus 1. 121 00:05:38,160 --> 00:05:42,130 >> Jika kita mengambil faktorial dengan 3, itu 3 kali faktorial dari 3 minus 1, 122 00:05:42,130 --> 00:05:43,070 atau 2. 123 00:05:43,070 --> 00:05:47,330 Dan jika kita tidak melihat 1, jika tidak 124 00:05:47,330 --> 00:05:51,710 kembali n kali faktorial dari n minus 1. 125 00:05:51,710 --> 00:05:53,210 Ini cukup sederhana. 126 00:05:53,210 --> 00:05:57,360 >> Dan demi memiliki sedikit bersih dan kode lebih elegan, 127 00:05:57,360 --> 00:06:01,440 tahu bahwa jika kita memiliki loop single-line atau single-line cabang bersyarat, 128 00:06:01,440 --> 00:06:04,490 kita bisa menyingkirkan semua kurung kurawal sekitar mereka. 129 00:06:04,490 --> 00:06:06,850 Jadi kita dapat mengkonsolidasikan ini untuk ini. 130 00:06:06,850 --> 00:06:09,640 Ini memiliki persis sama fungsi karena ini. 131 00:06:09,640 --> 00:06:13,850 >> Aku hanya mengambil pergi keriting yang kawat gigi, karena hanya ada satu baris 132 00:06:13,850 --> 00:06:18,500 dalam cabang-cabang bersyarat. 133 00:06:18,500 --> 00:06:21,160 Jadi ini berperilaku identik. 134 00:06:21,160 --> 00:06:23,800 Jika n adalah sama dengan 1, kembali 1. 135 00:06:23,800 --> 00:06:28,351 Jika tidak kembali n kali faktorial dari n minus 1. 136 00:06:28,351 --> 00:06:29,850 Jadi kita membuat masalah yang lebih kecil. 137 00:06:29,850 --> 00:06:33,850 Jika n mulai sebagai 5, kita akan kembali 5 kali faktorial dari 4. 138 00:06:33,850 --> 00:06:37,100 Dan kita akan melihat dalam satu menit ketika kita berbicara tentang stack-- panggilan di video lain 139 00:06:37,100 --> 00:06:39,390 di mana kita berbicara tentang memanggil stack-- kita akan belajar 140 00:06:39,390 --> 00:06:41,630 tentang mengapa persis proses ini bekerja. 141 00:06:41,630 --> 00:06:46,970 >> Tapi sementara faktorial 5 mengatakan kembali 5 kali faktorial 4, dan 4 142 00:06:46,970 --> 00:06:49,710 akan mengatakan, OK, baik, pulang 4 kali faktorial dari 3. 143 00:06:49,710 --> 00:06:51,737 Dan seperti yang Anda lihat, kami semacam mendekati 1. 144 00:06:51,737 --> 00:06:53,820 Kami semakin dekat dan lebih dekat dengan kasus dasar. 145 00:06:53,820 --> 00:06:58,180 >> Dan setelah kita memukul kasus dasar, semua fungsi sebelumnya 146 00:06:58,180 --> 00:07:00,540 memiliki jawaban yang mereka cari. 147 00:07:00,540 --> 00:07:03,900 Faktorial 2 berkata kembali 2 kali faktorial dari 1. 148 00:07:03,900 --> 00:07:06,760 Nah, faktorial 1 kembali 1. 149 00:07:06,760 --> 00:07:10,090 Jadi panggilan untuk faktorial dari 2 dapat kembali 2 kali 1, 150 00:07:10,090 --> 00:07:13,980 dan memberikan yang kembali ke faktorial 3, yang sedang menunggu hasil itu. 151 00:07:13,980 --> 00:07:17,110 >> Dan kemudian dapat menghitung hasilnya, 3 kali 2 adalah 6, 152 00:07:17,110 --> 00:07:18,907 dan mengembalikannya kepada faktorial dari 4. 153 00:07:18,907 --> 00:07:20,740 Dan lagi, kita memiliki video pada panggilan stack 154 00:07:20,740 --> 00:07:23,810 di mana ini diilustrasikan sedikit lebih dari apa yang saya katakan sekarang. 155 00:07:23,810 --> 00:07:25,300 Tapi ini itu. 156 00:07:25,300 --> 00:07:29,300 Ini saja adalah solusi untuk menghitung faktorial dari sebuah nomor. 157 00:07:29,300 --> 00:07:31,527 >> Ini hanya empat baris kode. 158 00:07:31,527 --> 00:07:32,610 Itu cukup keren, kan? 159 00:07:32,610 --> 00:07:35,480 Ini semacam seksi. 160 00:07:35,480 --> 00:07:38,580 >> Jadi secara umum, tetapi tidak selalu, fungsi rekursif 161 00:07:38,580 --> 00:07:41,190 dapat menggantikan loop dalam fungsi non-rekursif. 162 00:07:41,190 --> 00:07:46,100 Jadi di sini, berdampingan, adalah berulang versi fungsi faktorial. 163 00:07:46,100 --> 00:07:49,650 Kedua menghitung ini hal yang sama. 164 00:07:49,650 --> 00:07:52,170 >> Mereka berdua menghitung faktorial dari n. 165 00:07:52,170 --> 00:07:54,990 Versi di sebelah kiri menggunakan rekursi untuk melakukannya. 166 00:07:54,990 --> 00:07:58,320 Versi di sebelah kanan menggunakan iterasi untuk melakukannya. 167 00:07:58,320 --> 00:08:02,050 >> Dan pemberitahuan, kita harus mendeklarasikan sebuah produk variabel integer. 168 00:08:02,050 --> 00:08:02,940 Dan kemudian kita loop. 169 00:08:02,940 --> 00:08:06,790 Selama n lebih besar dari 0, kita menjaga mengalikan bahwa produk oleh n 170 00:08:06,790 --> 00:08:09,890 dan decrementing n sampai kita menghitung produk. 171 00:08:09,890 --> 00:08:14,600 Jadi dua fungsi ini, sekali lagi, melakukan hal yang sama. 172 00:08:14,600 --> 00:08:19,980 Tapi mereka tidak melakukannya di cara yang persis sama. 173 00:08:19,980 --> 00:08:22,430 >> Sekarang, adalah mungkin untuk memiliki lebih dari satu basis 174 00:08:22,430 --> 00:08:25,770 kasus atau lebih dari satu kasus rekursif, tergantung 175 00:08:25,770 --> 00:08:27,670 apa fungsi Anda sedang mencoba untuk melakukan. 176 00:08:27,670 --> 00:08:31,650 Anda tidak harus hanya terbatas kasus dasar tunggal atau rekursif tunggal 177 00:08:31,650 --> 00:08:32,370 kasus. 178 00:08:32,370 --> 00:08:35,320 Jadi contoh dari sesuatu dengan beberapa kasus basis 179 00:08:35,320 --> 00:08:37,830 mungkin this-- yang Urutan nomor Fibonacci. 180 00:08:37,830 --> 00:08:41,549 >> Anda mungkin ingat dari hari SD 181 00:08:41,549 --> 00:08:45,740 bahwa urutan Fibonacci didefinisikan seperti this-- elemen pertama adalah 0. 182 00:08:45,740 --> 00:08:46,890 Elemen kedua adalah 1. 183 00:08:46,890 --> 00:08:49,230 Kedua mereka adalah hanya dengan definisi. 184 00:08:49,230 --> 00:08:55,920 >> Kemudian setiap elemen lain didefinisikan sebagai jumlah dari n minus 1 dan n minus 2. 185 00:08:55,920 --> 00:09:00,330 Jadi elemen ketiga akan 0 ditambah 1 adalah 1. 186 00:09:00,330 --> 00:09:03,280 Dan kemudian elemen keempat akan menjadi elemen kedua, 1, 187 00:09:03,280 --> 00:09:06,550 ditambah elemen ketiga, 1. 188 00:09:06,550 --> 00:09:08,507 Dan itu akan menjadi 2. 189 00:09:08,507 --> 00:09:09,340 Dan seterusnya dan seterusnya. 190 00:09:09,340 --> 00:09:11,680 >> Jadi dalam hal ini, kita memiliki dua kasus dasar. 191 00:09:11,680 --> 00:09:14,850 Jika n adalah sama dengan 1, kembali 0. 192 00:09:14,850 --> 00:09:18,560 Jika n adalah sama dengan 2, kembali 1. 193 00:09:18,560 --> 00:09:25,930 Jika tidak, kembali Fibonacci dari n minus 1 ditambah Fibonacci dari n minus 2. 194 00:09:25,930 --> 00:09:27,180 >> Jadi itulah beberapa kasus dasar. 195 00:09:27,180 --> 00:09:29,271 Bagaimana beberapa kasus rekursif? 196 00:09:29,271 --> 00:09:31,520 Nah, ada sesuatu disebut dugaan Collatz. 197 00:09:31,520 --> 00:09:34,630 Saya tidak akan mengatakan, Anda tahu apa itu, 198 00:09:34,630 --> 00:09:38,170 karena itu sebenarnya akhir kita masalah untuk video tertentu. 199 00:09:38,170 --> 00:09:43,220 Dan itu latihan kami untuk bekerja bersama-sama. 200 00:09:43,220 --> 00:09:46,760 >> Jadi, inilah apa Collatz dugaan is-- 201 00:09:46,760 --> 00:09:48,820 itu berlaku untuk setiap bilangan bulat positif. 202 00:09:48,820 --> 00:09:51,500 Dan berspekulasi bahwa itu selalu mungkin untuk mendapatkan kembali 203 00:09:51,500 --> 00:09:55,060 1 jika Anda mengikuti langkah-langkah ini. 204 00:09:55,060 --> 00:09:57,560 Jika n adalah 1, berhenti. 205 00:09:57,560 --> 00:10:00,070 Kita harus kembali ke 1 jika n adalah 1. 206 00:10:00,070 --> 00:10:05,670 >> Jika tidak, melalui ini Proses lagi pada n dibagi 2. 207 00:10:05,670 --> 00:10:08,200 Dan lihat apakah Anda bisa mendapatkan kembali ke 1. 208 00:10:08,200 --> 00:10:13,260 Jika tidak, jika n ganjil, melalui Proses ini lagi pada 3n ditambah 1, 209 00:10:13,260 --> 00:10:15,552 atau 3 kali n ditambah 1. 210 00:10:15,552 --> 00:10:17,010 Jadi di sini kita memiliki kasus basa tunggal. 211 00:10:17,010 --> 00:10:18,430 Jika n adalah sama dengan 1, berhenti. 212 00:10:18,430 --> 00:10:20,230 Kami tidak melakukan rekursi lagi. 213 00:10:20,230 --> 00:10:23,730 >> Tapi kami memiliki dua kasus rekursif. 214 00:10:23,730 --> 00:10:28,750 Jika n genap, kami melakukan satu rekursif kasus, memanggil n dibagi 2. 215 00:10:28,750 --> 00:10:33,950 Jika n ganjil, kita melakukan yang berbeda rekursif kasus pada 3 kali n ditambah 1. 216 00:10:33,950 --> 00:10:39,120 >> Dan tujuan untuk video ini untuk mengambil kedua, jeda video, 217 00:10:39,120 --> 00:10:42,440 dan mencoba dan menulis ini fungsi rekursif Collatz 218 00:10:42,440 --> 00:10:47,640 di mana Anda lulus dalam nilai n, dan menghitung berapa banyak langkah itu 219 00:10:47,640 --> 00:10:52,430 dibutuhkan untuk sampai ke 1 jika Anda mulai dari n dan Anda mengikuti langkah-langkah di atas. 220 00:10:52,430 --> 00:10:56,660 Jika n adalah 1, dibutuhkan 0 langkah. 221 00:10:56,660 --> 00:11:00,190 Jika tidak, itu akan mengambil satu langkah ditambah namun 222 00:11:00,190 --> 00:11:06,200 banyak langkah yang diperlukan di kedua n dibagi 2 jika n genap, atau 3n ditambah 1 223 00:11:06,200 --> 00:11:08,100 jika n ganjil. 224 00:11:08,100 --> 00:11:11,190 >> Sekarang, saya sudah memasang di layar sini beberapa hal tes untuk Anda, 225 00:11:11,190 --> 00:11:15,690 beberapa kasus tes untuk Anda, untuk melihat apa berbagai nomor Collatz ini, 226 00:11:15,690 --> 00:11:17,440 dan juga ilustrasi dari langkah-langkah yang 227 00:11:17,440 --> 00:11:20,390 perlu ditempuh sehingga Anda dapat semacam melihat proses ini dalam tindakan. 228 00:11:20,390 --> 00:11:24,222 Jadi jika n adalah sama dengan 1, Collatz dari n adalah 0. 229 00:11:24,222 --> 00:11:26,180 Anda tidak perlu melakukan apa saja untuk mendapatkan kembali ke 1. 230 00:11:26,180 --> 00:11:27,600 Anda sudah ada. 231 00:11:27,600 --> 00:11:30,550 >> Jika n adalah 2, dibutuhkan satu langkah untuk sampai ke 1. 232 00:11:30,550 --> 00:11:31,810 Anda mulai dengan 2. 233 00:11:31,810 --> 00:11:33,100 Nah, 2 tidak sama dengan 1. 234 00:11:33,100 --> 00:11:36,580 Jadi itu akan menjadi salah satu langkah ditambah namun banyak langkah itu 235 00:11:36,580 --> 00:11:38,015 mengambil n dibagi 2. 236 00:11:38,015 --> 00:11:41,280 237 00:11:41,280 --> 00:11:42,910 >> 2 dibagi dengan 2 adalah 1. 238 00:11:42,910 --> 00:11:47,200 Sehingga dibutuhkan satu langkah ditambah namun banyak langkah yang diperlukan untuk 1. 239 00:11:47,200 --> 00:11:49,720 1 mengambil langkah nol. 240 00:11:49,720 --> 00:11:52,370 >> Untuk 3, seperti yang Anda lihat, ada beberapa langkah yang terlibat. 241 00:11:52,370 --> 00:11:53,590 Anda pergi dari 3. 242 00:11:53,590 --> 00:11:56,710 Dan kemudian Anda pergi ke 10, 5, 16, 8, 4, 2, 1. 243 00:11:56,710 --> 00:11:58,804 Dibutuhkan tujuh langkah untuk kembali ke 1. 244 00:11:58,804 --> 00:12:01,220 Dan seperti yang Anda lihat, ada beberapa uji kasus lain di sini 245 00:12:01,220 --> 00:12:02,470 untuk menguji program anda. 246 00:12:02,470 --> 00:12:03,970 Jadi sekali lagi, menghentikan video sementara. 247 00:12:03,970 --> 00:12:09,210 Dan aku akan pergi melompat kembali sekarang untuk apa sebenarnya proses di sini, 248 00:12:09,210 --> 00:12:11,390 apa dugaan ini. 249 00:12:11,390 --> 00:12:14,140 >> Lihat apakah Anda dapat mengetahui bagaimana mendefinisikan Collatz dari n 250 00:12:14,140 --> 00:12:19,967 sehingga menghitung berapa banyak langkah yang diperlukan untuk mendapatkan 1. 251 00:12:19,967 --> 00:12:23,050 Jadi mudah-mudahan, Anda telah berhenti video dan Anda tidak hanya menunggu saya 252 00:12:23,050 --> 00:12:25,820 untuk memberikan jawabannya di sini. 253 00:12:25,820 --> 00:12:29,120 Tapi jika Anda, baik, inilah jawabannya pula. 254 00:12:29,120 --> 00:12:33,070 >> Jadi, inilah definisi mungkin dari fungsi Collatz. 255 00:12:33,070 --> 00:12:35,610 Basis kami case-- jika n adalah sama dengan 1, kita kembali 0. 256 00:12:35,610 --> 00:12:38,250 Tidak mengambil langkah-langkah untuk kembali ke 1. 257 00:12:38,250 --> 00:12:42,710 >> Jika tidak, kita memiliki dua cases-- rekursif satu untuk nomor genap dan satu untuk ganjil. 258 00:12:42,710 --> 00:12:47,164 Cara saya menguji nomor bahkan adalah untuk memeriksa apakah n mod 2 sama dengan 0. 259 00:12:47,164 --> 00:12:49,080 Ini pada dasarnya adalah, sekali lagi, mengajukan pertanyaan, 260 00:12:49,080 --> 00:12:54,050 jika Anda ingat is-- apa mod jika saya membagi n oleh 2 adalah tidak ada sisa? 261 00:12:54,050 --> 00:12:55,470 Itu akan menjadi genap. 262 00:12:55,470 --> 00:13:01,370 >> Dan jadi jika n mod 2 sama dengan 0 adalah pengujian ini genap. 263 00:13:01,370 --> 00:13:04,250 Jika demikian, saya ingin kembali 1, karena ini jelas 264 00:13:04,250 --> 00:13:09,270 mengambil satu langkah ditambah Collatz dari apapun jumlah setengah dari saya. 265 00:13:09,270 --> 00:13:13,910 Jika tidak, saya ingin kembali 1 ditambah Collatz dari 3 kali n ditambah 1. 266 00:13:13,910 --> 00:13:16,060 Itu yang lain Langkah rekursif yang kita 267 00:13:16,060 --> 00:13:19,470 bisa mengambil untuk menghitung Collatz-- jumlah langkah 268 00:13:19,470 --> 00:13:22,610 dibutuhkan untuk mendapatkan kembali 1 diberi nomor. 269 00:13:22,610 --> 00:13:24,610 Jadi mudah-mudahan, contoh ini memberi Anda sedikit 270 00:13:24,610 --> 00:13:26,620 dari rasa prosedur rekursif. 271 00:13:26,620 --> 00:13:30,220 Mudah-mudahan, Anda berpikir kode adalah sedikit lebih indah jika diterapkan 272 00:13:30,220 --> 00:13:32,760 dalam cara rekursif elegan. 273 00:13:32,760 --> 00:13:35,955 Tetapi bahkan jika tidak, rekursi adalah alat yang sangat kuat tetap. 274 00:13:35,955 --> 00:13:38,330 Dan jadi pasti sesuatu untuk mendapatkan kepala Anda sekitar, 275 00:13:38,330 --> 00:13:41,360 karena Anda akan dapat membuat program keren menggunakan rekursi 276 00:13:41,360 --> 00:13:45,930 yang mungkin menjadi kompleks untuk menulis jika Anda menggunakan loop dan iterasi. 277 00:13:45,930 --> 00:13:46,980 Aku Doug Lloyd. 278 00:13:46,980 --> 00:13:48,780 Ini adalah CS50. 279 00:13:48,780 --> 00:13:50,228