1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J. MALAN: Este es CS50 y este es el comienzo de la semana cuatro. 3 00:00:14,050 --> 00:00:18,630 Y, muchacho, es Volkswagen en problemas todo por culpa de software. 4 00:00:18,630 --> 00:00:20,264 Echemos un vistazo. 5 00:00:20,264 --> 00:00:20,930 [REPRODUCCIÓN DE VÍDEO] 6 00:00:20,930 --> 00:00:25,560 -Cars, Los personajes más inteligentes en las películas de Rápido y Furioso. 7 00:00:25,560 --> 00:00:29,100 Esta semana fabricante de automóviles alemán Volkswagen encontró 8 00:00:29,100 --> 00:00:32,490 en medio de un escándalo de proporciones potencialmente criminales. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Se prepara para miles de millones en multas, posibles cargos criminales 10 00:00:36,060 --> 00:00:38,560 para sus ejecutivos, como la compañía se disculpa 11 00:00:38,560 --> 00:00:41,840 para la manipulación de los 11 millones de coches al ayudarla a vencer las pruebas de emisiones. 12 00:00:41,840 --> 00:00:44,950 >> Modelos diesel -Ciertos eran diseñado con un sofisticado software 13 00:00:44,950 --> 00:00:48,440 que la información usada incluyendo el posición de la dirección y el vehículo 14 00:00:48,440 --> 00:00:51,870 acelerar para determinar el coche era someterse a las pruebas de emisiones. 15 00:00:51,870 --> 00:00:55,650 Bajo esa circunstancia, el motor reduciría las emisiones tóxicas. 16 00:00:55,650 --> 00:00:59,070 Pero el coche fue manipulada a puente que cuando se estaba siendo conducido. 17 00:00:59,070 --> 00:01:03,320 Las emisiones aumentaron de 10 a 40 veces por encima de los niveles de EPA aceptables. 18 00:01:03,320 --> 00:01:04,280 >> [FIN DE REPRODUCCIÓN] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J. MALAN: Así que vamos a mira esto 20 00:01:05,220 --> 00:01:07,250 y ver exactamente cómo esto podría ser implementado 21 00:01:07,250 --> 00:01:09,680 y cómo esto podría afectar tantos coches como este. 22 00:01:09,680 --> 00:01:12,840 Así que en mi mano aquí son la prensa lanzamiento que fue emitida por la EPA-- 23 00:01:12,840 --> 00:01:14,620 el Medio Ambiente Agencia de Protección cual 24 00:01:14,620 --> 00:01:18,032 es la agencia reguladora estadounidense que maneja las preocupaciones ambientales, 25 00:01:18,032 --> 00:01:19,740 y luego el real aviso legal que era 26 00:01:19,740 --> 00:01:22,420 enviar a Volkswagen hace apenas unos días. 27 00:01:22,420 --> 00:01:26,530 >> Así que la EPA escribe, y revela ahora públicamente, un software sofisticado 28 00:01:26,530 --> 00:01:29,390 algoritmo en cierta Vehículos Volkswagen detecta 29 00:01:29,390 --> 00:01:32,630 cuando el coche está en pruebas de emisiones oficiales 30 00:01:32,630 --> 00:01:36,505 y convierte las emisiones completos controla solamente durante la prueba. 31 00:01:36,505 --> 00:01:38,380 La eficacia de estos vehículos contaminación 32 00:01:38,380 --> 00:01:43,260 dispositivos de control de emisiones es enormemente reducido durante toda la conducción normal 33 00:01:43,260 --> 00:01:44,320 situaciones. 34 00:01:44,320 --> 00:01:48,190 Esto se traduce en coches que cumplen con la estándares en el laboratorio o pruebas 35 00:01:48,190 --> 00:01:52,790 estación, pero durante el funcionamiento normal emitir oxides-- nitrógeno o NOx-- 36 00:01:52,790 --> 00:01:54,950 de hasta 40 veces la norma. 37 00:01:54,950 --> 00:01:58,220 El software producido por Volkswagen es un dispositivo de fin de la cita cita, derrota, 38 00:01:58,220 --> 00:02:00,650 tal como se define por el Clean Ley de Aire en los EE.UU.. 39 00:02:00,650 --> 00:02:03,410 >> Ellos van a decir que la EPA y otra agencia 40 00:02:03,410 --> 00:02:07,020 descubierto el dispositivo manipulador software después de un análisis independiente 41 00:02:07,020 --> 00:02:09,660 por investigadores de West Universidad de Virginia. 42 00:02:09,660 --> 00:02:14,160 NOx contribuye a la contaminación el dióxido de nitrógeno, ozono troposférico, 43 00:02:14,160 --> 00:02:15,700 y las partículas finas. 44 00:02:15,700 --> 00:02:18,090 La exposición a estos contaminantes se ha relacionado 45 00:02:18,090 --> 00:02:20,870 con una amplia gama de efectos graves de salud, 46 00:02:20,870 --> 00:02:23,637 incluyendo aumento del asma ataques y otros respiratoria 47 00:02:23,637 --> 00:02:26,470 enfermedades que pueden ser lo suficientemente graves enviar a la gente al hospital. 48 00:02:26,470 --> 00:02:28,660 La exposición a ozono y materia en partículas tiene también 49 00:02:28,660 --> 00:02:31,960 ha asociado con prematura muerte por respiratoria relacionada 50 00:02:31,960 --> 00:02:35,690 o cardiovascular efectos relacionados. 51 00:02:35,690 --> 00:02:38,940 Los niños, los ancianos, las personas con enfermedad respiratoria preexistente 52 00:02:38,940 --> 00:02:42,840 están particularmente en riesgo de efectos en la salud de estos contaminantes. 53 00:02:42,840 --> 00:02:45,056 >> Baste decir, es muy grave. 54 00:02:45,056 --> 00:02:46,930 Y vamos a leer sólo un extracto más 55 00:02:46,930 --> 00:02:49,370 y luego vamos a echar un vistazo a las implicaciones subyacentes 56 00:02:49,370 --> 00:02:50,920 de esto en el contexto de un coche. 57 00:02:50,920 --> 00:02:53,730 En concreto, Volkswagen fabricado e instalado 58 00:02:53,730 --> 00:02:56,210 software en la llamada control electrónico 59 00:02:56,210 --> 00:02:59,320 module-- o ECM-- de estos vehículos que detectados 60 00:02:59,320 --> 00:03:03,580 cuando el vehículo se está probando para el cumplimiento de las normas de emisión de la EPA. 61 00:03:03,580 --> 00:03:07,510 Sobre la base de diversos insumos, incluido el posición de la rueda de dirección, vehículo 62 00:03:07,510 --> 00:03:11,280 velocidad, la duración del motor de operación, y la presión barométrica, 63 00:03:11,280 --> 00:03:13,720 estos insumos precisamente seguido de los parámetros 64 00:03:13,720 --> 00:03:17,600 del procedimiento de ensayo utilizado para federal las pruebas de emisiones para la certificación de la EPA 65 00:03:17,600 --> 00:03:18,400 propósitos. 66 00:03:18,400 --> 00:03:21,850 >> Durante las pruebas de emisiones de la EPA, el software vehículos ECM 67 00:03:21,850 --> 00:03:25,060 corrió software que produjo resultados de emisiones compatibles. 68 00:03:25,060 --> 00:03:28,340 El resto del tiempo, el software ECM vehículo 69 00:03:28,340 --> 00:03:31,090 corrió un camino separado calibración que redujo 70 00:03:31,090 --> 00:03:34,360 la eficacia de la sistema global de control de emisiones, 71 00:03:34,360 --> 00:03:37,864 específicamente el catalítica selectiva reducción del NOx magra trap-- 72 00:03:37,864 --> 00:03:39,280 que ya lo veremos en un momento. 73 00:03:39,280 --> 00:03:43,040 Como resultado, las emisiones de NOx aumentado por un factor de 10 a 40 veces 74 00:03:43,040 --> 00:03:47,450 por encima de los niveles compatibles con la EPA dependiendo del tipo de ciclo de conducción. 75 00:03:47,450 --> 00:03:50,800 >> Así que lo que esto realmente significa, y la código fuente para el software de funcionamiento 76 00:03:50,800 --> 00:03:53,190 en el Volkswagen de que no tiene sin embargo, dado a conocer públicamente, 77 00:03:53,190 --> 00:03:56,460 es que, efectivamente, este equivalente es en algún lugar en el interior 78 00:03:56,460 --> 00:03:57,830 del código de Volkswagen. 79 00:03:57,830 --> 00:04:02,200 Si usted está siendo probado, y si el coche detecta ciertos factores ambientales 80 00:04:02,200 --> 00:04:04,330 al igual que el volante posición o el movimiento 81 00:04:04,330 --> 00:04:06,710 o falta de ella del coche o cualquier número de otros factores 82 00:04:06,710 --> 00:04:09,940 que son la hipótesis actualmente a ser parte de esta fórmula, 83 00:04:09,940 --> 00:04:12,370 simplemente se encienden controlar las emisiones completas. 84 00:04:12,370 --> 00:04:15,670 En otras palabras, empiezan emitiendo menos de los contaminantes. 85 00:04:15,670 --> 00:04:18,769 >> De lo contrario, en todos los demás situación cuando no se detecta como 86 00:04:18,769 --> 00:04:20,790 en el laboratorio, simplemente no lo hacen. 87 00:04:20,790 --> 00:04:24,320 Y así se puede simplificar esto en más pseudocódigo de hormigón con algo 88 00:04:24,320 --> 00:04:24,820 Me gusta esto. 89 00:04:24,820 --> 00:04:27,810 Si las ruedas están dando vuelta pero el volante no es, sugerente 90 00:04:27,810 --> 00:04:30,060 que el coche está en algún tipo de cilindro giratorio 91 00:04:30,060 --> 00:04:32,550 pero en algún tipo de almacén está probando, 92 00:04:32,550 --> 00:04:36,070 a continuación, se comportan como el EPA le gustaría que usted. 93 00:04:36,070 --> 00:04:37,960 De lo contrario no. 94 00:04:37,960 --> 00:04:40,420 Así que vamos a echar un vistazo en un corto vídeo que 95 00:04:40,420 --> 00:04:45,391 echa un vistazo a lo que las implicaciones son de este hecho mecánicamente. 96 00:04:45,391 --> 00:04:48,620 >> [REPRODUCCIÓN DE VÍDEO] 97 00:04:48,620 --> 00:04:52,800 >> -Última Viernes la EPA anunció que algunos Autos Volkswagen Audi hicieron entre 2009 98 00:04:52,800 --> 00:04:55,840 y este año estaban usando un dispositivo llamado derrota 99 00:04:55,840 --> 00:04:59,060 moverse por las leyes de emisiones diseñada para mantener el aire limpio. 100 00:04:59,060 --> 00:05:01,700 Pero, ¿qué significa eso exactamente? 101 00:05:01,700 --> 00:05:04,666 >> Bueno, los coches modernos tienen docenas de los ordenadores dentro de ellos. 102 00:05:04,666 --> 00:05:07,040 Y algunos de esos equipos ayudar a coordinar las funciones 103 00:05:07,040 --> 00:05:09,590 del motor para una óptima el rendimiento mientras se asegura 104 00:05:09,590 --> 00:05:12,340 que no hay demasiada basura que sale del tubo de escape. 105 00:05:12,340 --> 00:05:15,170 Ellos realmente han estado trabajando de esta manera desde hace varias décadas. 106 00:05:15,170 --> 00:05:17,380 Básicamente, cada parte del motor de un coche moderno 107 00:05:17,380 --> 00:05:20,080 tiene un sensor o controlador en ella, y estas computadoras 108 00:05:20,080 --> 00:05:23,460 están leyendo en los datos de miles de veces por segundo para preparar ajustes 109 00:05:23,460 --> 00:05:26,220 al igual que la proporción de combustible al aire eso va en los cilindros. 110 00:05:26,220 --> 00:05:28,730 >> Estos Volkswagen engaño y modelos de Audi son los motores diesel, 111 00:05:28,730 --> 00:05:30,890 y los diesel tienen una más realmente importante equipo 112 00:05:30,890 --> 00:05:34,030 parámetros controlados, que es la cantidad de combustible no quemado ir 113 00:05:34,030 --> 00:05:35,200 en el escape. 114 00:05:35,200 --> 00:05:36,310 Ahora que suena mal. 115 00:05:36,310 --> 00:05:39,642 No suena como usted quiere combustible no quemado de entrar en el tubo de escape. 116 00:05:39,642 --> 00:05:41,600 Pero en el caso de una diesel, usted tiene algo 117 00:05:41,600 --> 00:05:46,110 llamado una trampa de NOx que es un dispositivo que absorbe y trampas para los óxidos de nitrógeno 118 00:05:46,110 --> 00:05:48,880 que son contaminantes que haría de lo contrario ir a la atmósfera. 119 00:05:48,880 --> 00:05:53,040 Y el efecto de esa trampa de NOx se ve reforzada con el combustible sin quemar. 120 00:05:53,040 --> 00:05:56,650 Así que un dispositivo manipulador es un programa especial dentro de estos equipos que pueden hacer que sea 121 00:05:56,650 --> 00:05:59,527 verá como el coche cumple con las emisiones normas incluso cuando no lo hace. 122 00:05:59,527 --> 00:06:01,110 Volkswagen tenía un problema en sus manos. 123 00:06:01,110 --> 00:06:04,050 Sus motores diesel eran conocidos para conseguir un gran ahorro de combustible, 124 00:06:04,050 --> 00:06:07,510 pero la trampa de NOx sólo funciona bien cuando se está utilizando más combustible. 125 00:06:07,510 --> 00:06:10,460 Así que el coche sería detectar, el uso de este dispositivo de la derrota, 126 00:06:10,460 --> 00:06:13,870 cuando se estaba haciendo una de las emisiones prueba, sería utilizar más combustible, 127 00:06:13,870 --> 00:06:16,830 hacer bien el trabajo trampa de NOx, emisiones estarían bien. 128 00:06:16,830 --> 00:06:21,130 Pero entonces usted consigue en el camino, el dispositivo se apaga, usted está quemando menos combustible 129 00:06:21,130 --> 00:06:24,256 pero usted está poniendo tanto como 40 veces más contaminantes a la atmósfera. 130 00:06:24,256 --> 00:06:26,130 Pero, ¿cómo lo hizo diablos el coche sabe que era 131 00:06:26,130 --> 00:06:27,720 se está probando para el cumplimiento de las emisiones? 132 00:06:27,720 --> 00:06:30,590 La EPA dice que fue un sofisticado sistema que comprueba cosas 133 00:06:30,590 --> 00:06:34,090 como la posición del volante, la velocidad, el tiempo que el motor estaba encendido, 134 00:06:34,090 --> 00:06:35,507 e incluso la presión atmosférica. 135 00:06:35,507 --> 00:06:37,673 En otras palabras, hubo ninguna manera esto fue accidental 136 00:06:37,673 --> 00:06:40,260 porque el software fue diseñado con mucho cuidado para detectar 137 00:06:40,260 --> 00:06:41,630 una prueba oficial de emisiones. 138 00:06:41,630 --> 00:06:43,588 Eso es algo de muy serio engaño y eso es 139 00:06:43,588 --> 00:06:45,420 ¿por Volkswagen está en tales serios problemas. 140 00:06:45,420 --> 00:06:48,600 De hecho, su consejero delegado, Martin Winterkorn, simplemente renunció. 141 00:06:48,600 --> 00:06:49,820 >> Entonces, ¿qué pasa después? 142 00:06:49,820 --> 00:06:53,900 Bueno, si eres uno de los millones de media Jetta diesel, Beatles, Golfs, Passat, 143 00:06:53,900 --> 00:06:56,220 o Audi A3S efectúa, La buena noticia es es 144 00:06:56,220 --> 00:06:57,886 de que su coche está todavía seguro para conducir. 145 00:06:57,886 --> 00:07:00,510 Usted no tiene que dejarlo a un lado hasta que Volkswagen emite un retiro. 146 00:07:00,510 --> 00:07:02,509 Pero en algún momento son probablemente va a tener 147 00:07:02,509 --> 00:07:04,230 para actualizar el software dentro de su coche. 148 00:07:04,230 --> 00:07:06,927 Cuando eso sucede usted puede ser tener menos millas por tanque. 149 00:07:06,927 --> 00:07:09,260 Los abogados ya están preparando para demandas colectivas 150 00:07:09,260 --> 00:07:12,500 lo que los propietarios podrían quedar compensado en algún momento en el futuro. 151 00:07:12,500 --> 00:07:15,832 Pero eso no va a suceder en el corto plazo. 152 00:07:15,832 --> 00:07:16,711 >> [FIN DE REPRODUCCIÓN] 153 00:07:16,711 --> 00:07:19,960 DAVID J. MALAN: Así que esto plantea en realidad una interesante cuestión de imagen más grande 154 00:07:19,960 --> 00:07:20,660 en cuanto a la confianza. 155 00:07:20,660 --> 00:07:21,160 ¿Correcto? 156 00:07:21,160 --> 00:07:24,300 Todos nosotros tienen iPhones o Androids o algo en nuestros bolsillos más probable 157 00:07:24,300 --> 00:07:26,500 estos días, o portátiles en nuestros largos que son 158 00:07:26,500 --> 00:07:28,510 software que se ejecuta hecho por Apple y Microsoft 159 00:07:28,510 --> 00:07:30,710 y racimos de otras empresas. 160 00:07:30,710 --> 00:07:34,240 Pero, ¿cómo sabemos que lo que estos productos de software están haciendo 161 00:07:34,240 --> 00:07:37,680 es en realidad lo que estos compañías dicen que están haciendo? 162 00:07:37,680 --> 00:07:39,610 >> Por ejemplo, ¿quién puede decir que cada vez que 163 00:07:39,610 --> 00:07:42,200 hacer una llamada en su iPhone o teléfono Android o similares, 164 00:07:42,200 --> 00:07:45,650 que ese número de teléfono tampoco es siendo subido al servidor de alguna empresa 165 00:07:45,650 --> 00:07:48,399 debido a algún programa que tienes escrito, si se trata de la operación 166 00:07:48,399 --> 00:07:51,070 sistema en sí como iOS o Android, o porque usted ha descargado 167 00:07:51,070 --> 00:07:53,880 alguna aplicación de terceros que de alguna manera es escuchar 168 00:07:53,880 --> 00:07:57,120 a todo lo que estás escribiendo en o todo lo que en realidad estás diciendo. 169 00:07:57,120 --> 00:07:59,500 ¿Cómo sabes que, cuando se ustedes están ejecutando Clang 170 00:07:59,500 --> 00:08:02,590 O Hacer compilar su software propio en CS50, cómo 171 00:08:02,590 --> 00:08:06,080 ¿te el propio personal de que CS50, por medio de la biblioteca CS50, 172 00:08:06,080 --> 00:08:08,690 No ha sido la tala cada cadena que jamás ha llegado 173 00:08:08,690 --> 00:08:10,276 o cada pulgada que has conseguido? 174 00:08:10,276 --> 00:08:12,900 Bueno, ciertamente se podría mirar en el código fuente de algo 175 00:08:12,900 --> 00:08:15,233 como la biblioteca CS50, que podría mirar el código fuente 176 00:08:15,233 --> 00:08:18,170 para el sistema operativo Linux que se ejecuta en IDE CS50. 177 00:08:18,170 --> 00:08:23,090 Pero una presentación increíble se le dio en 1984 178 00:08:23,090 --> 00:08:26,730 en la recepción del Premio Turing por un informático muy famoso conocido 179 00:08:26,730 --> 00:08:29,750 como-- llamado Ken Thompson, quien recibió el Premio Turing, que 180 00:08:29,750 --> 00:08:33,500 es una especie de ciencia de equipo Premio Nobel, si se quiere, 181 00:08:33,500 --> 00:08:35,309 por su trabajo en un sistema operativo llamado 182 00:08:35,309 --> 00:08:39,039 Unix, que es muy similar en espíritu para lo que utilizamos, que es Linux. 183 00:08:39,039 --> 00:08:41,960 Y la pregunta que le hizo en su discurso de aceptación, en esencia 184 00:08:41,960 --> 00:08:44,910 por el que se fija el marco para años y años de discusión 185 00:08:44,910 --> 00:08:46,970 acerca de la confianza y la seguridad, era esto. 186 00:08:46,970 --> 00:08:50,410 ¿Hasta qué punto si uno la confianza de un declaración que un program-- una pieza 187 00:08:50,410 --> 00:08:53,010 de software-- está libre de los caballos de Troya? 188 00:08:53,010 --> 00:08:56,500 Tal vez sea más importante confiar la gente que escribió el software. 189 00:08:56,500 --> 00:08:58,650 >> Y, de hecho, nos hemos vinculado a la charla que él 190 00:08:58,650 --> 00:09:02,400 dio al aceptar este premio en los años 80 en el sitio web del CS50 191 00:09:02,400 --> 00:09:04,030 en la página de Conferencias para hoy. 192 00:09:04,030 --> 00:09:06,071 Porque lo que verás es que en realidad le da 193 00:09:06,071 --> 00:09:09,430 bastante simple ejemplo de cómo incluso un compilador como Clang o lo que sea 194 00:09:09,430 --> 00:09:13,950 compiladores otros han utilizado en el pasado, ¿y si incrusta en el que el compilador 195 00:09:13,950 --> 00:09:18,190 nosotros están utilizando es un poco si condición de que esencialmente dice, 196 00:09:18,190 --> 00:09:22,360 si usted nota que el código está utilizando la función GetString o la getInt 197 00:09:22,360 --> 00:09:26,600 función, adelante e inserte una puerta trasera o un caballo de Troya 198 00:09:26,600 --> 00:09:29,340 de tal manera que ese programa ahora cuenta con algunos ceros 199 00:09:29,340 --> 00:09:30,930 y los que lo hacen algo malicioso. 200 00:09:30,930 --> 00:09:33,080 Registro de la totalidad de su pulsaciones de teclado, carga de los datos 201 00:09:33,080 --> 00:09:35,100 a algún servidor, o realmente cualquier cosa. 202 00:09:35,100 --> 00:09:37,290 >> Y lo que Ken Thompson va a hacer en su charla 203 00:09:37,290 --> 00:09:40,580 es demostrar que, incluso si usted tiene acceso a la fuente 204 00:09:40,580 --> 00:09:43,794 código de un compilador que maliciosamente podría estar haciendo esto, 205 00:09:43,794 --> 00:09:46,210 no importa porque hay este huevo y la gallina 206 00:09:46,210 --> 00:09:49,500 realidad del pasado que muchos años mediante el cual los compiladores 207 00:09:49,500 --> 00:09:51,960 se utilizan para compilar ellos mismos. 208 00:09:51,960 --> 00:09:55,440 En otras palabras, camino de vuelta cuando alguien tenía que haber escrito el primer compilador. 209 00:09:55,440 --> 00:09:59,060 Y a partir de entonces, cada vez que he actualizado un compilador cambiando su código fuente, 210 00:09:59,060 --> 00:10:02,020 la adición de características y recompilarla para gente como nosotros a utilizar, así, 211 00:10:02,020 --> 00:10:04,270 que están usando la vieja versión del compilador 212 00:10:04,270 --> 00:10:06,370 para compilar el nuevo versión del compilador. 213 00:10:06,370 --> 00:10:08,370 Y si usted echa un vistazo en la charla que ha dado, 214 00:10:08,370 --> 00:10:10,970 verás que ya de que la circularidad, 215 00:10:10,970 --> 00:10:14,330 en realidad se puede tener errores o Troyanos incorporados en el software 216 00:10:14,330 --> 00:10:14,990 estamos utilizando. 217 00:10:14,990 --> 00:10:18,010 E incluso si nos fijamos en la código fuente de los programas, 218 00:10:18,010 --> 00:10:21,550 ni siquiera podría ser evidente debido a que el engaño es en realidad 219 00:10:21,550 --> 00:10:24,710 de alguna versión anterior de un compilador que desde entonces ha sido 220 00:10:24,710 --> 00:10:27,340 la inyección de la amenaza en nuestro software. 221 00:10:27,340 --> 00:10:29,740 >> Lo cual es sólo para decir, que realmente no puede y no debe 222 00:10:29,740 --> 00:10:32,939 confiar en el software que se ejecuta en nuestros ordenadores portátiles o teléfonos o cualquier número de lugares. 223 00:10:32,939 --> 00:10:36,230 Y, de hecho, más adelante en este semestre cuando empezamos a hablar de la programación web 224 00:10:36,230 --> 00:10:38,521 y en realidad empezar a construir aplicaciones web nosotros mismos, 225 00:10:38,521 --> 00:10:40,285 hablaremos de éstos amenazas y otros. 226 00:10:40,285 --> 00:10:43,410 Ahora, es posible que se haya preguntado y se dio cuenta que había un diminuto Darth 227 00:10:43,410 --> 00:10:45,842 Vader en los clips que The Verge mostraba allí 228 00:10:45,842 --> 00:10:47,550 acerca de Volkswagen. Si que nunca has visto, me 229 00:10:47,550 --> 00:10:49,190 pensamos que debería aligerar el estado de ánimo, porque esto es todo 230 00:10:49,190 --> 00:10:50,780 muy deprimente y alarmante. 231 00:10:50,780 --> 00:10:52,910 Voy a mirar hacia atrás en el Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 cuando un comercial por Volkswagen-- y esto 233 00:10:55,300 --> 00:10:59,620 casi los hace agradables nuevo-- salió al aire por primera vez en la televisión. 234 00:10:59,620 --> 00:11:04,039 Es el segundo clip 60 que creo que usted disfrutará. 235 00:11:04,039 --> 00:11:04,705 [REPRODUCCIÓN DE VÍDEO] 236 00:11:04,705 --> 00:11:08,198 [MÚSICA - TEMA DE "STAR WARS"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [Perro ladra] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [CAR COMIENZA] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [FIN DE REPRODUCCIÓN] 243 00:12:05,955 --> 00:12:06,830 DAVID J. MALAN: Sí. 244 00:12:06,830 --> 00:12:07,663 Sólo estaba revisando. 245 00:12:07,663 --> 00:12:11,360 Ese coche está en la lista de violaciónes. 246 00:12:11,360 --> 00:12:12,000 Correcto. 247 00:12:12,000 --> 00:12:14,040 Así que nos fijamos en algunos Pseudocódigo hace un momento. 248 00:12:14,040 --> 00:12:15,380 Y aquí está una más grande fragmento de código pseudocódigo 249 00:12:15,380 --> 00:12:16,921 que hemos visto un par de veces hasta ahora. 250 00:12:16,921 --> 00:12:19,970 Y vamos a usar esta es una oportunidad ahora para introducir una nueva programación 251 00:12:19,970 --> 00:12:23,776 técnica que hicimos ver algorítmicamente 252 00:12:23,776 --> 00:12:25,400 la semana pasada cuando miramos fusión tipo. 253 00:12:25,400 --> 00:12:28,270 Pero vamos a formalizarlo y ver cómo podríamos utilizarlo en código real, 254 00:12:28,270 --> 00:12:30,350 y luego vamos a utilizar este técnica por el camino más 255 00:12:30,350 --> 00:12:32,000 probabilidades de resolver otros problemas. 256 00:12:32,000 --> 00:12:35,790 >> Así que este fue uno de los primeros programas que nunca escribió, aunque de Código pseudocódigo. 257 00:12:35,790 --> 00:12:37,790 Y lo que este programa nos permitió hacer curso 258 00:12:37,790 --> 00:12:41,510 era encontrar Mike Smith en una guía telefónica. 259 00:12:41,510 --> 00:12:46,216 Y cuenta, en particular, las líneas de ocho y 11, que tenía esta declaración en Ir a. 260 00:12:46,216 --> 00:12:48,090 Y de hecho, cierta idiomas, C entre ellos, 261 00:12:48,090 --> 00:12:50,006 en realidad tienen un declaración que es, literalmente, 262 00:12:50,006 --> 00:12:52,710 ir a que le permite saltar a una línea específica. 263 00:12:52,710 --> 00:12:55,470 Es generalmente mal visto porque que se puede abusar fácilmente 264 00:12:55,470 --> 00:12:58,490 y usted puede empezar a saltar de su programa por todo el lugar en oposición 265 00:12:58,490 --> 00:13:00,690 al uso de la clase de la lógica y el flujo de control 266 00:13:00,690 --> 00:13:04,000 que hemos utilizado hasta ahora con sólo bucles y condiciones y similares. 267 00:13:04,000 --> 00:13:08,660 >> Pero podemos simplificar este algoritmo en el código de pseudocódigo de la siguiente manera. 268 00:13:08,660 --> 00:13:11,250 En lugar de esta iterativo o bucle enfoque 269 00:13:11,250 --> 00:13:14,160 donde siempre regresamos y de ida y vuelta a la línea de tres, 270 00:13:14,160 --> 00:13:18,300 ¿por qué no sólo tipo de Punt y más en general, dicen en línea de siete y 10, 271 00:13:18,300 --> 00:13:20,570 basta con sustituir esos dos pares de líneas con, 272 00:13:20,570 --> 00:13:22,810 más si Smith es anterior en el libro que vamos a 273 00:13:22,810 --> 00:13:25,110 buscar Mike en el media izquierda del libro. 274 00:13:25,110 --> 00:13:28,560 Porque si Smith es más tarde en el libro, buscar Mike en la derecha 275 00:13:28,560 --> 00:13:29,540 la mitad del libro. 276 00:13:29,540 --> 00:13:31,180 Y ya notar la circularidad. 277 00:13:31,180 --> 00:13:31,680 ¿Correcto? 278 00:13:31,680 --> 00:13:34,250 Estoy en busca de Mike en la guía telefónica y después 279 00:13:34,250 --> 00:13:37,090 Finalmente me pegué tal vez línea de siete o tal vez la línea 10 280 00:13:37,090 --> 00:13:41,089 y mi instrucción para mí es la búsqueda Mike en la mitad de la guía telefónica. 281 00:13:41,089 --> 00:13:42,380 Bueno, ¿cómo puedo buscar Mike? 282 00:13:42,380 --> 00:13:44,213 Estoy en el medio de la búsqueda de Mike, ¿por qué 283 00:13:44,213 --> 00:13:45,860 estás suerte de que me envía en un círculo? 284 00:13:45,860 --> 00:13:49,590 Pero eso está bien porque lo que es sucediendo al tamaño del problema, 285 00:13:49,590 --> 00:13:52,630 como está escrito en la línea 7 y 10? 286 00:13:52,630 --> 00:13:54,989 No sólo estamos diciendo búsqueda para Mike, buscar Mike. 287 00:13:54,989 --> 00:13:56,280 Estamos diciendo específicamente qué? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Buscar por él en la mitad izquierda de la mitad derecha que es efectivamente 290 00:14:01,610 --> 00:14:03,440 la mitad del tamaño del problema. 291 00:14:03,440 --> 00:14:07,170 Así que está bien que estamos tipo de participar en esta circularidad, 292 00:14:07,170 --> 00:14:09,180 este argumento circular, porque al menos estamos 293 00:14:09,180 --> 00:14:11,090 haciendo que el problema más y más pequeña. 294 00:14:11,090 --> 00:14:14,220 Y, finalmente, vamos a llegar que el llamado caso base, donde 295 00:14:14,220 --> 00:14:16,780 tenemos una sola página izquierda- como nuestro voluntario la semana pasada 296 00:14:16,780 --> 00:14:18,684 did-- teníamos una página la izquierda y luego no lo hacemos 297 00:14:18,684 --> 00:14:21,600 tiene que seguir buscando Mike Smith porque está bien en esa página 298 00:14:21,600 --> 00:14:23,080 o no lo es. 299 00:14:23,080 --> 00:14:27,480 >> Entonces, ¿cómo podemos poner en práctica esta idea, este especie de circularidad en el código real? 300 00:14:27,480 --> 00:14:31,030 Bueno, podemos aprovechar una técnica eso es generalmente conocida como recursividad. 301 00:14:31,030 --> 00:14:33,960 Y hemos visto esto en el pseudocódigo para el ordenamiento por mezcla la semana pasada. 302 00:14:33,960 --> 00:14:37,190 Recordemos que este fue el pseudocódigo para el ordenamiento por mezcla. 303 00:14:37,190 --> 00:14:40,560 Podría decirse que es aún más simple que burbuja o la selección o la ordenación por inserción 304 00:14:40,560 --> 00:14:43,310 sólo en términos de la simplicidad con el que puede expresarlo. 305 00:14:43,310 --> 00:14:46,750 >> Pero eso es porque estamos especie de circular 306 00:14:46,750 --> 00:14:51,350 diciendo: buscar algo mediante la búsqueda de nuevo. 307 00:14:51,350 --> 00:14:53,960 Pero estamos buscando, ya sea en la mitad izquierda o la mitad derecha 308 00:14:53,960 --> 00:14:56,070 y luego, eventualmente estamos la fusión en este caso. 309 00:14:56,070 --> 00:14:58,520 Pero aquí, también, con esas dos líneas de clasificación, 310 00:14:58,520 --> 00:15:01,320 nos volvemos a tener presente idea de recursividad. 311 00:15:01,320 --> 00:15:05,350 Y concretamente lo que esto significa, en el contexto de un algoritmo, 312 00:15:05,350 --> 00:15:10,880 es que un algoritmo es recursivo si se utiliza o se hace llamar. 313 00:15:10,880 --> 00:15:14,330 >> O en términos de C, una función es recursive-- una función llamada 314 00:15:14,330 --> 00:15:18,510 foo es recursivo si foo, en algún lugar de su código fuente, 315 00:15:18,510 --> 00:15:21,250 llama a la propia función foo. 316 00:15:21,250 --> 00:15:25,790 Y eso es malo si todo foo alguna vez lo hace es llamar a sí mismo una y otra vez. 317 00:15:25,790 --> 00:15:30,600 Está bien si foo se detiene el tiempo, al igual que ordenamiento por mezcla, al decir, espera un minuto, 318 00:15:30,600 --> 00:15:32,980 si este problema es super pequeña, por ejemplo, 319 00:15:32,980 --> 00:15:35,840 o lo encontré quien soy buscando, simplemente volver. 320 00:15:35,840 --> 00:15:41,000 No de forma recursiva, no lo hagas cíclicamente nuevo llamarme. 321 00:15:41,000 --> 00:15:44,200 >> Y así vamos a echar un vistazo a cómo esto podría funcionar. 322 00:15:44,200 --> 00:15:48,430 Así que voy a seguir adelante y abierto dos ejemplos de código fuente aquí. 323 00:15:48,430 --> 00:15:50,321 Una de ellas se llama sigma 0. 324 00:15:50,321 --> 00:15:52,320 Y esto no es en absoluto recursivo, pero echemos 325 00:15:52,320 --> 00:15:53,694 Un vistazo a lo que hace este programa. 326 00:15:53,694 --> 00:15:55,737 He despojado toda comentarios de ella, pero todos 327 00:15:55,737 --> 00:15:58,070 del código fuente en CS50 de página comentarios si 328 00:15:58,070 --> 00:15:59,570 querer leer a través de él de nuevo más tarde. 329 00:15:59,570 --> 00:16:02,010 Y vamos a hacer un par de cordura comprueba aquí. 330 00:16:02,010 --> 00:16:06,640 >> Así que en la parte superior de este código, que tenemos son CS50.h. 331 00:16:06,640 --> 00:16:07,650 ¿Qué hace esto? 332 00:16:07,650 --> 00:16:08,990 ¿Por qué aquí? 333 00:16:08,990 --> 00:16:11,740 En términos sencillos razonable. 334 00:16:11,740 --> 00:16:12,424 ¿Qué hace? 335 00:16:12,424 --> 00:16:12,858 Sí. 336 00:16:12,858 --> 00:16:14,160 >> AUDIENCIA: ¿Así que la función getInt funciona. 337 00:16:14,160 --> 00:16:16,243 >> DAVID J. MALAN: Para que la función getInt funciona. 338 00:16:16,243 --> 00:16:18,115 Porque dentro de este archivo, CS50.h, que 339 00:16:18,115 --> 00:16:20,950 veremos en poco tiempo en términos de su código fuente, 340 00:16:20,950 --> 00:16:23,270 tiene un montón de funciones declared-- getInt, GetString, 341 00:16:23,270 --> 00:16:26,950 y un montón de otros- y, a menos en realidad tenemos que Incluyen línea, 342 00:16:26,950 --> 00:16:29,320 el compilador no es Clang va a saber que existe. 343 00:16:29,320 --> 00:16:32,400 Y mismo ocurre con la línea dos donde se define int 344 00:16:32,400 --> 00:16:35,101 printf, que es una función seguimos usando un poco. 345 00:16:35,101 --> 00:16:37,850 Ahora, la línea de cuatro parece un poco raro porque es sólo un chiste. 346 00:16:37,850 --> 00:16:41,570 Tiene un punto y coma, sin rizado llaves, no hay código dentro de ella. 347 00:16:41,570 --> 00:16:44,640 Pero lo que hicimos nosotros llamamos esta cosa de semana pasado? 348 00:16:44,640 --> 00:16:45,140 Sí. 349 00:16:45,140 --> 00:16:46,060 Así, un prototipo. 350 00:16:46,060 --> 00:16:48,390 ¿Y por qué tenemos una prototipo que parece 351 00:16:48,390 --> 00:16:51,050 a ser un poco redundante normalmente porque normalmente 352 00:16:51,050 --> 00:16:53,474 ver la función de nuevo más adelante en el archivo, ¿verdad? 353 00:16:53,474 --> 00:16:56,390 Así que ¿por qué no eres más que tener-- rascándose la cabeza, pero voy a tomar. 354 00:16:56,390 --> 00:16:57,302 Sí. 355 00:16:57,302 --> 00:17:00,000 >> AUDIENCIA: [inaudible] la función después de la principal. 356 00:17:00,000 --> 00:17:01,000 DAVID J. MALAN: Exactamente. 357 00:17:01,000 --> 00:17:04,089 Para que el compilador te conoce finalmente va a definir o implementar 358 00:17:04,089 --> 00:17:06,579 después de que la función principal, presumiblemente. 359 00:17:06,579 --> 00:17:08,462 Así Clang y la mayoría compiladores son una especie de tonto 360 00:17:08,462 --> 00:17:10,510 y que sólo sabrán lo que les digas. 361 00:17:10,510 --> 00:17:12,569 Y si desea utilizar una función llamada sigma, 362 00:17:12,569 --> 00:17:15,710 usted enseña mejor el compilador que existe de antemano. 363 00:17:15,710 --> 00:17:17,970 >> Ahora, en sí principal, incluso aunque es un montón de líneas, 364 00:17:17,970 --> 00:17:19,839 es bastante familiarizado con suerte por ahora. 365 00:17:19,839 --> 00:17:21,942 Tiene un do while cuyo propósito en la vida 366 00:17:21,942 --> 00:17:24,400 aquí aparentemente es conseguir un entero positivo desde el usuario. 367 00:17:24,400 --> 00:17:27,349 Y justo mantenerlo molestando o ella hasta que cooperar. 368 00:17:27,349 --> 00:17:30,670 Luego, en la línea 16 que tengo una llamada interesante. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Que en la mano izquierda lado me da un Int 371 00:17:33,710 --> 00:17:36,650 que puede almacén-- llamada Answer-- que se va a almacenar, al parecer, 372 00:17:36,650 --> 00:17:39,090 el valor de retorno de sigma. 373 00:17:39,090 --> 00:17:41,840 Así sigma es sólo una nombre arbitrario pero significativo 374 00:17:41,840 --> 00:17:44,500 que yo he dado a una función cuyo propósito en la vida 375 00:17:44,500 --> 00:17:47,680 es tomar uno argument-- lo llamaremos N en este caso-- 376 00:17:47,680 --> 00:17:52,280 y acaba de tomar la suma de ese número más cada número positivo que es 377 00:17:52,280 --> 00:17:53,200 menor que ella. 378 00:17:53,200 --> 00:17:58,140 >> Así que si paso en el número 2 de sigma, quiero añadir 2 más 1 379 00:17:58,140 --> 00:18:00,240 además 0-- no 0-- manera que me da 3. 380 00:18:00,240 --> 00:18:05,320 Si paso de 3 a sigma, quiero tiene 3 más 2 más 1, lo que me da 6. 381 00:18:05,320 --> 00:18:05,900 Etcetera. 382 00:18:05,900 --> 00:18:09,750 Por lo tanto, sólo se suma todo el números menores que o iguales a ella. 383 00:18:09,750 --> 00:18:12,040 >> Ahora, aquí sólo voy para imprimir la respuesta. 384 00:18:12,040 --> 00:18:17,330 Así como una comprobación de validez rápida, vamos a hacer sigma 0-- sigma slash dot 0-- 385 00:18:17,330 --> 00:18:18,690 y déjame escribo en 2. 386 00:18:18,690 --> 00:18:19,960 Y de hecho consigo 3. 387 00:18:19,960 --> 00:18:21,240 Permítanme escribo en 3. 388 00:18:21,240 --> 00:18:22,860 Yo a la verdad consigo 6. 389 00:18:22,860 --> 00:18:27,636 Y si alguien puede hacer los cálculos rápidamente, si hago 50 ¿qué voy llegar? 390 00:18:27,636 --> 00:18:29,839 >> AUDIENCIA: [inaudible]. 391 00:18:29,839 --> 00:18:30,880 DAVID J. MALAN: Bueno, no. 392 00:18:30,880 --> 00:18:33,340 Pero 1275 que está bastante cerca. 393 00:18:33,340 --> 00:18:38,850 Así que esto es el resultado de hacer 50 más 49, más 48, más 47, más 46 394 00:18:38,850 --> 00:18:40,349 hasta el fondo a 1. 395 00:18:40,349 --> 00:18:41,390 Así que eso es todo sigma hace. 396 00:18:41,390 --> 00:18:43,350 Pero vamos a ver cómo hemos implementado ahora. 397 00:18:43,350 --> 00:18:45,790 Así que aquí es la propia función. 398 00:18:45,790 --> 00:18:49,000 Y esto no parece tener nada que ver con la recursividad todavía. 399 00:18:49,000 --> 00:18:51,070 De hecho, estamos usando un técnica de la vieja escuela. 400 00:18:51,070 --> 00:18:56,680 Estoy inicializar una variable llamada suma a cero, entonces tengo una foreloop aquí, 401 00:18:56,680 --> 00:19:00,790 y estoy declarando un Int llamada I, haciéndola igual a 1-- 402 00:19:00,790 --> 00:19:04,080 aunque podría ponerlo igual a cero, pero desde que estoy haciendo, además, 403 00:19:04,080 --> 00:19:05,340 a quién le importa si es cero o uno. 404 00:19:05,340 --> 00:19:06,660 Se va a tener ningún efecto. 405 00:19:06,660 --> 00:19:10,110 >> Así que estoy iteración siempre que I es menos de o igual a m, que 406 00:19:10,110 --> 00:19:11,671 es el argumento de que fue aprobada en. 407 00:19:11,671 --> 00:19:13,670 Y entonces yo sigo incrementando I. Y idea 408 00:19:13,670 --> 00:19:20,010 del bucle de todo lo que estoy haciendo es hacer suma más iguales I. Y eso es deliberado. 409 00:19:20,010 --> 00:19:22,326 Yo no quiero hacer, en este caso, como suma plus plus. 410 00:19:22,326 --> 00:19:24,790 Quiero añadir realidad el valor actual de I 411 00:19:24,790 --> 00:19:28,190 que mantiene cada vez más grande y más grande y más grande a la cuenta en ejecución. 412 00:19:28,190 --> 00:19:30,210 >> Y entonces vuelvo suma. 413 00:19:30,210 --> 00:19:33,850 Y así respuesta obtiene la suma de valor. 414 00:19:33,850 --> 00:19:35,282 Y luego imprimirlo. 415 00:19:35,282 --> 00:19:37,740 Así que hay una oportunidad aquí, sin embargo, para simplificar tipo de 416 00:19:37,740 --> 00:19:41,260 este código conceptualmente y el tipo de golpe de uno 417 00:19:41,260 --> 00:19:43,250 mente en términos de la simplicidad a pesar de que 418 00:19:43,250 --> 00:19:45,700 toma un tiempo para ordenar de apreciar por qué este 419 00:19:45,700 --> 00:19:47,330 es de gran alcance en estos pequeños ejemplos. 420 00:19:47,330 --> 00:19:50,380 Aquí es así que la sigma uno-- segunda versión de este código. 421 00:19:50,380 --> 00:19:55,290 Todo hasta la parte superior es idéntica manera la misma historia se aplica como antes. 422 00:19:55,290 --> 00:19:59,220 Pero ahora vamos a ver el aplicación de sigma que 423 00:19:59,220 --> 00:20:05,040 He reducido a sólo estos lines-- cuatro líneas de código, de verdad, 424 00:20:05,040 --> 00:20:06,980 además de algunas llaves y espacios en blanco. 425 00:20:06,980 --> 00:20:07,930 >> Pero, ¿qué estoy haciendo? 426 00:20:07,930 --> 00:20:11,050 Si m es menor que o igual a cero, tengo que manejar tipo de 427 00:20:11,050 --> 00:20:12,490 ese caso super simple. 428 00:20:12,490 --> 00:20:15,450 Y si usted me entregue cero o nada negativa que es simplemente extraño, 429 00:20:15,450 --> 00:20:17,909 Yo sólo voy a arbitrariamente pero consistentemente volver a cero. 430 00:20:17,909 --> 00:20:20,200 No quiero que esta cosa entrar en algunos infinita raro 431 00:20:20,200 --> 00:20:21,810 bucle debido a un valor negativo. 432 00:20:21,810 --> 00:20:25,070 Así que estoy diciendo, si me das cero o menos, voy a volver a cero. 433 00:20:25,070 --> 00:20:28,220 >> Pero eso es bueno, porque eso es que sola página de la guía telefónica 434 00:20:28,220 --> 00:20:28,790 lo que queda. 435 00:20:28,790 --> 00:20:32,660 Estoy mordiendo un problema muy específico y no llamar a algo de forma recursiva. 436 00:20:32,660 --> 00:20:36,580 Pero en la línea 31, lo que No me parece que estoy haciendo? 437 00:20:36,580 --> 00:20:39,780 Los paréntesis son sólo mantienen cosas, con suerte, un poco más claro. 438 00:20:39,780 --> 00:20:42,110 Pero todo lo que estoy haciendo es que soy regresar M-- lo 439 00:20:42,110 --> 00:20:45,790 de entregar mí-- más la valor de M-- lo siento, 440 00:20:45,790 --> 00:20:49,052 más el valor de sigma de m menos 1. 441 00:20:49,052 --> 00:20:50,010 Entonces, ¿qué significa esto? 442 00:20:50,010 --> 00:20:53,965 Si me das el número 3 como entrada, la respuesta que quiero conseguir en última instancia, 443 00:20:53,965 --> 00:20:57,307 es 6 ya 3 más 2 más 1 6 me da. 444 00:20:57,307 --> 00:20:59,390 Pero, ¿cómo lo pienso cómo se está ejecutando el código? 445 00:20:59,390 --> 00:21:03,070 La primera vez que yo llamo sigma y paso en el valor 3, 446 00:21:03,070 --> 00:21:07,960 eso es como decir que en una pieza de papel, aquí está el valor 3 447 00:21:07,960 --> 00:21:09,920 y me han pasado este como sigma. 448 00:21:09,920 --> 00:21:13,090 3 es, obviamente, no inferior a 0 por lo la condición IF no se aplica. 449 00:21:13,090 --> 00:21:14,020 El más lo hace. 450 00:21:14,020 --> 00:21:14,990 ¿Entonces que debo hacer? 451 00:21:14,990 --> 00:21:19,902 Quiero volver m, que es 3, además de sigma m menos 1. 452 00:21:19,902 --> 00:21:21,110 Así que permítanme un seguimiento de esto. 453 00:21:21,110 --> 00:21:22,710 Voy a poner esto pedazo de papel hacia abajo. 454 00:21:22,710 --> 00:21:24,668 ¿Y qué valor, para ser claro, voy a pasar 455 00:21:24,668 --> 00:21:26,540 en sigma en este punto de la historia? 456 00:21:26,540 --> 00:21:28,080 ¿Qué número? 457 00:21:28,080 --> 00:21:28,610 2, ¿verdad? 458 00:21:28,610 --> 00:21:29,670 3 menos 1 es 2. 459 00:21:29,670 --> 00:21:32,000 Así que sólo necesito un poco trozo de papel aquí. 460 00:21:32,000 --> 00:21:33,931 Así que ahora sigma se está llamado de nuevo. 461 00:21:33,931 --> 00:21:35,930 Y me he puesto deliberadamente esto abajo porque es 462 00:21:35,930 --> 00:21:38,070 algo así como una pausa esa versión de la historia 463 00:21:38,070 --> 00:21:40,720 porque ahora estoy centrado en señal de m menos 1. 464 00:21:40,720 --> 00:21:42,660 Así que era m 3, m menos 1 es 2. 465 00:21:42,660 --> 00:21:45,110 Así que aquí es 2 que he estado pasé. 466 00:21:45,110 --> 00:21:48,510 2 es, obviamente, no menos de 0 para que el caso no se aplica. 467 00:21:48,510 --> 00:21:53,445 Else vuelvo m, que es esto cosa, además de sigma de lo que de valor? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Así que si sigma de 1-- porque m es en este momento 2 para 2 menos 1 es 1. 470 00:21:59,650 --> 00:22:01,950 Así que ahora tengo sólo el valor 1. 471 00:22:01,950 --> 00:22:04,810 Estoy pasando simplemente el número 1 a la función sigma-- 472 00:22:04,810 --> 00:22:09,120 o yo mismo aquí-- modo 1 no es, obviamente, menor que cero, todavía no se aplica. 473 00:22:09,120 --> 00:22:12,970 >> Retorno Else 1 más sigma de qué? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Así que permítanme recuerdo. 476 00:22:14,678 --> 00:22:15,920 Voy a volver a eso más adelante. 477 00:22:15,920 --> 00:22:18,060 Ahora voy a seguir adelante y jota el número 0, porque eso es 478 00:22:18,060 --> 00:22:19,470 mi argumento o parámetro. 479 00:22:19,470 --> 00:22:22,400 Estoy pasé el número 0 y, finalmente, este proceso 480 00:22:22,400 --> 00:22:25,760 apenas de repetirme anuncio nauseum cesa porque lo 481 00:22:25,760 --> 00:22:28,820 Qué hago una vez que veo esto 0? 482 00:22:28,820 --> 00:22:29,790 Vuelvo cero. 483 00:22:29,790 --> 00:22:31,790 Así que ahora usted tiene que rebobinar la historia. 484 00:22:31,790 --> 00:22:34,430 >> Si ahora voy hacia atrás en el tiempo, ¿Qué fue lo más reciente 485 00:22:34,430 --> 00:22:36,670 Hice si estuviera literalmente rebobinar un vídeo? 486 00:22:36,670 --> 00:22:41,630 Voy a recoger el más reciente 1 y eso me da 1 más 0 es 1. 487 00:22:41,630 --> 00:22:44,100 Si sigo rebobinado de la historia, eso me va a dar 488 00:22:44,100 --> 00:22:46,880 2 plus este valor corriente, que es 1. 489 00:22:46,880 --> 00:22:47,789 Así que eso es 3. 490 00:22:47,789 --> 00:22:49,330 Y entonces yo voy a seguir rebobinado. 491 00:22:49,330 --> 00:22:54,220 La primera vez que puse el número 3-- modo 3 más 3 me da 6. 492 00:22:54,220 --> 00:22:57,272 >> Y ahora, si ha rebobinado el video hasta este punto, 493 00:22:57,272 --> 00:22:58,980 esta era la muy primera pregunta que hice. 494 00:22:58,980 --> 00:23:01,450 Cuando pasó 3, lo que es de 3 sigma? 495 00:23:01,450 --> 00:23:04,204 Es de hecho 6, la suma de todos estos pedazos de papel. 496 00:23:04,204 --> 00:23:07,120 Así que si eso toma un poco de tiempo para envolver su mente alrededor, eso está bien. 497 00:23:07,120 --> 00:23:10,700 Pero consideran que fue un poco-- que era muy deliberada que Apilé 498 00:23:10,700 --> 00:23:12,990 estos números en la parte superior de uno al otro. 499 00:23:12,990 --> 00:23:17,440 Es un poco como tener un memory-- un registro en el tiempo, 500 00:23:17,440 --> 00:23:19,940 como un depurador en un video, que, efectivamente, puedo retroceder en. 501 00:23:19,940 --> 00:23:24,350 Y vamos a volver a esa metáfora en sólo un poco. 502 00:23:24,350 --> 00:23:28,240 >> Pero primero, resulta que hay un montón de geeks y gente divertida, 503 00:23:28,240 --> 00:23:29,614 Supongo que, en Google. 504 00:23:29,614 --> 00:23:31,530 Ojalá alguien que es muy bueno en la mente de buscar en Google 505 00:23:31,530 --> 00:23:34,270 subiendo por un momento y ayúdame busco algo? 506 00:23:34,270 --> 00:23:35,650 Clave muy, muy bajo. 507 00:23:35,650 --> 00:23:37,870 Alguien que nunca es llegar antes, tal vez. 508 00:23:37,870 --> 00:23:38,370 OK. 509 00:23:38,370 --> 00:23:39,030 ¿Sí? 510 00:23:39,030 --> 00:23:39,530 Vamos. 511 00:23:39,530 --> 00:23:41,410 Baja. 512 00:23:41,410 --> 00:23:42,183 ¿Cómo te llamas? 513 00:23:42,183 --> 00:23:42,870 >> Sam Sam. 514 00:23:42,870 --> 00:23:44,290 >> DAVID J. MALAN: Sam, vamos hacia abajo. 515 00:23:44,290 --> 00:23:45,320 Este es el mismo. 516 00:23:45,320 --> 00:23:46,280 Encantada de conocerte. 517 00:23:46,280 --> 00:23:46,780 Oye. 518 00:23:46,780 --> 00:23:47,580 Vamos otra vez. 519 00:23:47,580 --> 00:23:51,290 Así que todo lo que necesito que hagas, si usted podría, Sam, aquí es Google. 520 00:23:51,290 --> 00:23:53,240 ¿Se puede buscar el término recursividad? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 No lo estropees. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> Y ahora let's-- sí. 525 00:24:00,970 --> 00:24:03,380 Aceptar Haga clic en eso. 526 00:24:03,380 --> 00:24:04,315 Mejor que haga clic. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ahh, lo consigue. 529 00:24:08,020 --> 00:24:08,520 ¿No? 530 00:24:08,520 --> 00:24:09,050 OK. 531 00:24:09,050 --> 00:24:10,430 Así que vamos a hacer un par de los demás. 532 00:24:10,430 --> 00:24:12,830 No tanto relacionada académicamente aquí, pero tienen que 533 00:24:12,830 --> 00:24:14,520 jamás buscado en Google para anagrama? 534 00:24:14,520 --> 00:24:15,280 >> SAM: No. 535 00:24:15,280 --> 00:24:15,520 >> DAVID J. MALAN: OK. 536 00:24:15,520 --> 00:24:17,186 Búsqueda de anagrama en lugar de recursividad. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 ¿Qué te parece torcida. 539 00:24:23,790 --> 00:24:25,515 ¿Alguna vez has buscado torcida? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Ahora, éste es un poco difícil de ver pero espero everything's-- Aceptar. 542 00:24:32,692 --> 00:24:34,150 Es sólo tú y yo disfrutando de esto. 543 00:24:34,150 --> 00:24:34,690 OK. 544 00:24:34,690 --> 00:24:38,950 >> Así que finalmente, este one's-- que es un poco torcida. 545 00:24:38,950 --> 00:24:40,810 Ahora haga un rollo de barril. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Maravilloso. 548 00:24:45,310 --> 00:24:45,910 Correcto. 549 00:24:45,910 --> 00:24:47,110 Muchísimas gracias a Sam. 550 00:24:47,110 --> 00:24:49,416 Aqui tienes. 551 00:24:49,416 --> 00:24:50,400 Gracias. 552 00:24:50,400 --> 00:24:52,807 >> Entonces, ¿qué está pasando en todo de estos ejemplos tontos? 553 00:24:52,807 --> 00:24:55,640 Así que en realidad, debajo de la capucha de Millones de líneas de código de Google 554 00:24:55,640 --> 00:24:58,860 al parecer es un poco tonto SI condiciones que son esencialmente 555 00:24:58,860 --> 00:25:01,160 comprobar si el usuario tiene escrito en esta frase, 556 00:25:01,160 --> 00:25:03,760 hacer algo que probablemente tuvo una cantidad no trivial de tiempo 557 00:25:03,760 --> 00:25:06,080 para poner en práctica sólo para ser divertido de esta manera. 558 00:25:06,080 --> 00:25:08,430 Pero eso es todo lo que se reduce hasta debajo de la campana. 559 00:25:08,430 --> 00:25:11,570 Pero, por supuesto, la recursividad es más de los más geeks 560 00:25:11,570 --> 00:25:13,880 ejemplo entre esos trucos especiales. 561 00:25:13,880 --> 00:25:16,880 Y seguro que hay otros por ahí así que tal vez ni siquiera hemos 562 00:25:16,880 --> 00:25:18,230 descubierto por el momento. 563 00:25:18,230 --> 00:25:22,830 >> Así que eche un vistazo, o considerar Ahora el siguiente programa, 564 00:25:22,830 --> 00:25:24,830 y ciertamente asir cualquier de estos en su salida. 565 00:25:24,830 --> 00:25:28,820 Voy a seguir adelante y abrir un programa que es 566 00:25:28,820 --> 00:25:30,920 va a tratar de intercambiar dos valores. 567 00:25:30,920 --> 00:25:33,210 Pero antes de ir allí, vamos a hacer esto. 568 00:25:33,210 --> 00:25:38,500 ¿Podríamos conseguir uno más voluntario, que pienso? 569 00:25:38,500 --> 00:25:40,480 ¿Te gustaría ser voluntario? 570 00:25:40,480 --> 00:25:40,980 ¿No? 571 00:25:40,980 --> 00:25:41,890 Vamos arriba. 572 00:25:41,890 --> 00:25:42,390 Vamos arriba. 573 00:25:42,390 --> 00:25:42,890 Correcto. 574 00:25:42,890 --> 00:25:44,136 Así que su nombre es qué? 575 00:25:44,136 --> 00:25:44,810 >> LAUREN: Lauren. 576 00:25:44,810 --> 00:25:45,768 >> DAVID J. MALAN: Lauren. 577 00:25:45,768 --> 00:25:46,890 Vamos arriba, Lauren. 578 00:25:46,890 --> 00:25:50,140 Así que Lauren está siendo desafiado aquí como sigue. 579 00:25:50,140 --> 00:25:52,310 Encantada de conocerte. 580 00:25:52,310 --> 00:25:55,730 Así Lauren aquí tiene delante de sus dos tazas vacías. 581 00:25:55,730 --> 00:25:57,570 Y tenemos algunos de naranja jugo y leche 582 00:25:57,570 --> 00:26:00,301 y vamos a ir adelante y hacer lo siguiente. 583 00:26:00,301 --> 00:26:01,550 Sólo vamos a llenar este. 584 00:26:01,550 --> 00:26:07,840 Unas onzas de leche por aquí y vamos a llenar un poco de jugo de naranja por aquí. 585 00:26:07,840 --> 00:26:11,475 >> Y delante de todos estos miembros de la audiencia, 586 00:26:11,475 --> 00:26:13,550 intercambiar los dos valores de estas tazas. 587 00:26:13,550 --> 00:26:16,970 Poner el jugo de naranja en el vaso de leche y la leche en la taza de jugo de naranja. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 ¿Cómo se hace esto si estuviera en casa y tenía acceso a otros materiales? 590 00:26:26,150 --> 00:26:27,400 LAUREN: Ponlo en otra taza. 591 00:26:27,400 --> 00:26:28,191 DAVID J. MALAN: OK. 592 00:26:28,191 --> 00:26:31,940 Así que vamos a echar un temporal variables, si lo haremos. 593 00:26:31,940 --> 00:26:35,871 Y seguir adelante ahora y poner en práctica este mismo procedimiento de intercambio. 594 00:26:35,871 --> 00:26:36,370 Tan bueno. 595 00:26:36,370 --> 00:26:41,490 Hemos puesto DO en el temporal variables, la leche en la variable DO, 596 00:26:41,490 --> 00:26:44,481 y ahora la variable temporal en la variable leche. 597 00:26:44,481 --> 00:26:44,980 OK. 598 00:26:44,980 --> 00:26:48,740 Así que muy bien hecho hasta ahora. 599 00:26:48,740 --> 00:26:50,990 Así que resulta fuera-- sostener que pensado por un momento. 600 00:26:50,990 --> 00:26:54,479 Aquí, sólo friki que un poco, este sería el código C correspondiente 601 00:26:54,479 --> 00:26:55,520 que simplemente implementamos. 602 00:26:55,520 --> 00:26:58,650 Teníamos dos entradas, A y B, ambos que sólo tendremos que decir con sencillez son 603 00:26:58,650 --> 00:26:59,260 int de. 604 00:26:59,260 --> 00:27:02,780 Y notar aquí, si quiero cambiar los valores de dos variables, a y b, 605 00:27:02,780 --> 00:27:06,890 que en verdad necesitamos un intermediario, un variable temporal, una taza temporal, 606 00:27:06,890 --> 00:27:10,830 en el que el vertido uno de los valores por lo que tenemos un marcador de posición para él. 607 00:27:10,830 --> 00:27:13,480 Pero entonces el código es exactamente como Lauren aquí implementado. 608 00:27:13,480 --> 00:27:15,500 >> Ahora, sólo para obtener una poco más loco, resulta 609 00:27:15,500 --> 00:27:20,930 que usted puede hacer esto sin una variable temporal. 610 00:27:20,930 --> 00:27:24,870 Para hacer esto correctamente, sin embargo, vamos a tener que hacer trampa con algo de química. 611 00:27:24,870 --> 00:27:26,380 Tenemos algunas copas de más aquí. 612 00:27:26,380 --> 00:27:29,600 Así que la cosa más cercana que se ve como la leche y el agua perhaps-- 613 00:27:29,600 --> 00:27:34,090 o leche y OJ-- es que tenemos alguna agua, por lo que vamos a llenar este uno 614 00:27:34,090 --> 00:27:36,486 con unas cuantas onzas de agua clara. 615 00:27:36,486 --> 00:27:38,332 Eso es probablemente demasiado. 616 00:27:38,332 --> 00:27:38,832 Sí. 617 00:27:38,832 --> 00:27:39,934 Eso es definitivamente demasiado. 618 00:27:39,934 --> 00:27:40,600 Mantenga en un segundo. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> Y ahora tenemos petróleo, que, según recuerdo de la clase de química de la escuela secundaria, 621 00:27:48,420 --> 00:27:49,990 espero que no se mezcla con agua. 622 00:27:49,990 --> 00:27:53,650 Pero que tipo de clase de se parece a la leche y zumo de naranja. 623 00:27:53,650 --> 00:27:55,760 Así que ahora, sin utilizar una variable temporal, 624 00:27:55,760 --> 00:27:59,260 puedes intercambiar esos dos valores? 625 00:27:59,260 --> 00:28:03,884 Así aceites entra en la taza de agua, el agua entra en la taza de aceite. 626 00:28:03,884 --> 00:28:04,800 LAUREN: No hay otras copas? 627 00:28:04,800 --> 00:28:05,940 DAVID J. MALAN: No hay otras copas. 628 00:28:05,940 --> 00:28:07,860 Y yo no he hecho probado esto antes de este año 629 00:28:07,860 --> 00:28:10,110 así que no sé si esto va a realmente trabajar químicamente. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 Eso no tenía que suceder. 632 00:28:18,650 --> 00:28:19,761 ¿Está funcionando? 633 00:28:19,761 --> 00:28:20,260 Correcto. 634 00:28:20,260 --> 00:28:20,990 Así que separar? 635 00:28:20,990 --> 00:28:21,490 Bien. 636 00:28:21,490 --> 00:28:24,714 Ahora llegamos a obtener la agua en la otra copa. 637 00:28:24,714 --> 00:28:27,630 Concentradores de química más inteligentes posible probablemente hacer esto mejor que yo. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: El agua está en la parte inferior. 639 00:28:28,510 --> 00:28:31,910 >> DAVID J. MALAN: El agua-- que era lo que es clave la última vez que hicimos esto. 640 00:28:31,910 --> 00:28:33,950 Tienes que hacerlo en el orden correcto. 641 00:28:33,950 --> 00:28:34,450 Sí. 642 00:28:34,450 --> 00:28:35,270 Eso está bien. 643 00:28:35,270 --> 00:28:37,290 Así que ahora tenemos dos tazas de aceite. 644 00:28:37,290 --> 00:28:37,790 OK. 645 00:28:37,790 --> 00:28:38,510 Eso está bien. 646 00:28:38,510 --> 00:28:40,110 Pero químicamente si esto funcionó de yo-- 647 00:28:40,110 --> 00:28:41,200 >> LAUREN: Esta es el agua. 648 00:28:41,200 --> 00:28:41,930 >> DAVID J. MALAN: Eso es todo agua. 649 00:28:41,930 --> 00:28:42,430 Correcto. 650 00:28:42,430 --> 00:28:44,210 Pero eso sigue siendo la misma copa que antes. 651 00:28:44,210 --> 00:28:47,570 Así vierta it-- intentarlo allí. 652 00:28:47,570 --> 00:28:49,300 OK. 653 00:28:49,300 --> 00:28:51,010 Este es un buen uso del tiempo de clase hoy. 654 00:28:51,010 --> 00:28:51,510 OK. 655 00:28:51,510 --> 00:28:53,890 Así que ahora nosotros-- agradable. 656 00:28:53,890 --> 00:28:55,460 Algo así. 657 00:28:55,460 --> 00:28:55,960 Correcto. 658 00:28:55,960 --> 00:28:56,690 Así que es muy bueno. 659 00:28:56,690 --> 00:29:00,006 ¡Gracias a Lauren. 660 00:29:00,006 --> 00:29:01,950 Muy bien hecho. 661 00:29:01,950 --> 00:29:04,570 >> Así que para hacer estallar sus mentes, y esto es tal vez algo 662 00:29:04,570 --> 00:29:08,660 jugar con si te gusta en ID CS50, puede, de hecho, intercambiar dos variables 663 00:29:08,660 --> 00:29:11,470 sin utilizar un número entero temporal. 664 00:29:11,470 --> 00:29:13,060 Y este es el código C correspondiente. 665 00:29:13,060 --> 00:29:16,110 Y si te acuerdas de la última Miércoles, hemos introducido, aunque brevemente, 666 00:29:16,110 --> 00:29:19,720 algunos de los nuevos operadores en C. Y lo hace Alguien recuerda lo que la pequeña zanahoria 667 00:29:19,720 --> 00:29:23,660 símbolo es, ese pequeño triangular símbolo desde el teclado representa? 668 00:29:23,660 --> 00:29:26,003 ¿Qué operador de bits? 669 00:29:26,003 --> 00:29:26,770 >> AUDIENCIA: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> DAVID J. MALAN: EXOR. 671 00:29:27,645 --> 00:29:28,560 Exclusivo o. 672 00:29:28,560 --> 00:29:32,920 Así que si quieres, sólo por diversión en casa, para dar a y b de dos arbitraria 673 00:29:32,920 --> 00:29:36,072 valores como cualquier eight-- y yo elegiría un valor de ocho bits. 674 00:29:36,072 --> 00:29:38,530 Si usted hace esto con 32 bits, obtendrá muy rápidamente aburrido. 675 00:29:38,530 --> 00:29:42,150 Pero acaba de dar una de ocho bits valor que es lo que sea, uno o dos, 676 00:29:42,150 --> 00:29:43,790 y darle b un valor similar. 677 00:29:43,790 --> 00:29:46,810 Y a continuación, utilizando la definición de XOR desde el pasado miércoles, 678 00:29:46,810 --> 00:29:52,560 solicitar que poco a poco, cada uno de esos ocho bits en cada uno de a y b, 679 00:29:52,560 --> 00:29:54,980 y luego hacer exactamente por este código. 680 00:29:54,980 --> 00:29:58,170 Y no es lo correcto que se ve aquí en la pantalla. 681 00:29:58,170 --> 00:30:02,100 En efecto, se reduce a tres operaciones XOR 682 00:30:02,100 --> 00:30:05,910 y de alguna manera mágicamente a y b intercambiarán posiciones 683 00:30:05,910 --> 00:30:08,010 sin perder ninguna información. 684 00:30:08,010 --> 00:30:11,580 >> Así que el truco aceite y el agua es el más cercano encarnación mundo real 685 00:30:11,580 --> 00:30:12,980 Se me ocurrió para imitar eso. 686 00:30:12,980 --> 00:30:15,950 Pero es seguramente más fácil utilizar una variable temporal, 687 00:30:15,950 --> 00:30:16,920 como en este caso. 688 00:30:16,920 --> 00:30:21,190 Y esto también se dice una oportunidad, también, este tipo de micro optimización, 689 00:30:21,190 --> 00:30:23,590 como un científico de la computación diría, mientras que tipo de diversión 690 00:30:23,590 --> 00:30:27,060 alardear de cómo se hizo esto sin como el intercambio con una variable adicional, 691 00:30:27,060 --> 00:30:28,640 que no es tan convincente. 692 00:30:28,640 --> 00:30:31,619 Debido a ahorrar 32 bits, como en el caso de un int real, 693 00:30:31,619 --> 00:30:33,410 No es todo lo que convincente en un sistema donde 694 00:30:33,410 --> 00:30:36,722 usted podría estar usando decenas de megabytes o aún más tales memoria estos días. 695 00:30:36,722 --> 00:30:38,680 Y de hecho, cuando lleguemos a un conjunto de problemas más adelante 696 00:30:38,680 --> 00:30:41,010 y se implementa hechizo corrector y usted 697 00:30:41,010 --> 00:30:43,550 el reto de hacerlo con esto como poco RAM y tan poco 698 00:30:43,550 --> 00:30:46,820 tiempo posible en el que computer-- todavía 699 00:30:46,820 --> 00:30:50,160 tener una semana para implementar it-- podrás tener-- podrás 700 00:30:50,160 --> 00:30:51,799 el reto de minimizar esos recursos. 701 00:30:51,799 --> 00:30:53,840 Y eso es realmente la única ocasionar este semestre 702 00:30:53,840 --> 00:30:57,940 donde se le anima a afeitarse fuera incluso el mejor rendimiento 703 00:30:57,940 --> 00:30:59,340 cuesta lo contrario. 704 00:30:59,340 --> 00:31:02,200 >> Así que-- ¿cómo podemos ver esto en código real? 705 00:31:02,200 --> 00:31:04,530 Déjame ir por delante ahora y abrir un ejemplo 706 00:31:04,530 --> 00:31:07,700 que deliberadamente se llama No swap, porque no lo hace 707 00:31:07,700 --> 00:31:10,670 De hecho cambiar las variables como en realidad se podría esperar. 708 00:31:10,670 --> 00:31:12,260 Así que vamos a echar un vistazo. 709 00:31:12,260 --> 00:31:17,050 He aquí un programa que no tiene CS50 biblioteca pasando, simplemente estándar de E / S. 710 00:31:17,050 --> 00:31:19,560 Ahora tenemos un prototipo por encima de la tapa de intercambio que acaba de 711 00:31:19,560 --> 00:31:21,540 significa que tiene que ser definido más adelante. 712 00:31:21,540 --> 00:31:22,550 Y aquí es principal. 713 00:31:22,550 --> 00:31:26,000 >> Me asignaron arbitrariamente x e y, respectivamente, los valores de uno y dos 714 00:31:26,000 --> 00:31:28,590 sólo porque son pequeñas y fácil que pensar. 715 00:31:28,590 --> 00:31:32,280 Y entonces sólo tengo un montón de printfs donde tengo una comprobación de validez. x es 1 716 00:31:32,280 --> 00:31:35,110 ey es 2 es presumiblemente lo que esos printfs dirán. 717 00:31:35,110 --> 00:31:36,530 Así que no hay magia hasta el momento. 718 00:31:36,530 --> 00:31:40,100 >> Entonces me voy a reclamar con imprimir def, intercambiando dot dot dot. 719 00:31:40,100 --> 00:31:43,730 Voy a llamar a la permuta función, pasando en x e y. 720 00:31:43,730 --> 00:31:47,350 Y supongamos por ahora que intercambio se lleva a cabo exactamente 721 00:31:47,350 --> 00:31:49,930 como lo era hace un momento con una variable temporal. 722 00:31:49,930 --> 00:31:52,670 Y por lo que pretendo con valentía, cambié. 723 00:31:52,670 --> 00:31:55,429 x es ahora esto e y es ahora que. 724 00:31:55,429 --> 00:31:57,220 Pero el archivo, por supuesto, se llama n Swap. 725 00:31:57,220 --> 00:31:58,678 Así que vamos a ver realmente lo que sucede. 726 00:31:58,678 --> 00:32:04,450 Si compilo sin swap y luego hacer ./noswap, x es 1, y es 2. 727 00:32:04,450 --> 00:32:05,770 Intercambio de casas intercambiado. 728 00:32:05,770 --> 00:32:07,200 x es 1, y es 2. 729 00:32:07,200 --> 00:32:11,980 Así que en realidad parece estar viciado incluso aunque swap-- vamos a desplazarse hacia abajo ahora-- 730 00:32:11,980 --> 00:32:16,542 se implementa exactamente por la código que propuso hace un momento. 731 00:32:16,542 --> 00:32:19,000 Así que no vamos a conseguir la suposición con las cosas XOR por ahora. 732 00:32:19,000 --> 00:32:21,890 Esto también debería funcionar al igual que con la leche y zumo de naranja, 733 00:32:21,890 --> 00:32:25,820 pero no parece estar funcionando. 734 00:32:25,820 --> 00:32:27,180 >> Así que vamos a hacer esto otra vez. 735 00:32:27,180 --> 00:32:29,310 Tal vez yo no estaba corriendo bien. 736 00:32:29,310 --> 00:32:32,010 Así que vamos a correr No Intercambiar nuevo. 737 00:32:32,010 --> 00:32:32,900 Quizás yo-- no. 738 00:32:32,900 --> 00:32:34,400 Así que es simplemente no funciona. 739 00:32:34,400 --> 00:32:36,060 Así que vamos a hacer un poco de comprobación de validez. 740 00:32:36,060 --> 00:32:39,690 Déjame ir por delante aquí en Intercambiar y acaba de agregar, espera un minuto, 741 00:32:39,690 --> 00:32:43,856 a es% i / n y vamos plug-in el valor de una. 742 00:32:43,856 --> 00:32:45,730 Porque realmente quiero para ver lo que está pasando. 743 00:32:45,730 --> 00:32:47,570 Y, en efecto, se trata de una técnica de depuración 744 00:32:47,570 --> 00:32:50,028 que usted podría estar utilizando en horas de oficina o en casa ya, 745 00:32:50,028 --> 00:32:53,560 similar a la primera mitad de Dan Vídeo de Armendáriz en PSET3 746 00:32:53,560 --> 00:32:56,870 en donde introdujimos print def como una técnica recomendada, al menos 747 00:32:56,870 --> 00:32:58,080 para los casos simples. 748 00:32:58,080 --> 00:33:01,720 Déjame ir adelante y corro hacer sin intercambio de nuevo, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Interesante. 751 00:33:05,840 --> 00:33:11,670 Así cuenta de lo que parece ser cierto. X es 1, y es 2, pero a es 2 cuando b es 1. 752 00:33:11,670 --> 00:33:16,790 Así que esos dos de alguna manera se canjearon pero x e y no están siendo intercambiados. 753 00:33:16,790 --> 00:33:21,090 Así que para ser claros, lo que está pasando es, aquí tengo xey 754 00:33:21,090 --> 00:33:25,380 y esas son las variables locales en el alcance de principal, estoy pasando x e y 755 00:33:25,380 --> 00:33:26,170 intercambiar. 756 00:33:26,170 --> 00:33:29,080 Ahora, swap, como una función separada, es libre de llamar a sus argumentos 757 00:33:29,080 --> 00:33:30,590 o su parámetros de lo que quiera. 758 00:33:30,590 --> 00:33:33,280 Foo o bar o xoy o aob. 759 00:33:33,280 --> 00:33:36,870 Sólo para dejar claro que ellos son no idéntica a x e y per se, 760 00:33:36,870 --> 00:33:38,020 Lo he dicho a y b. 761 00:33:38,020 --> 00:33:40,040 Pero podríamos llamarlos lo que queramos. 762 00:33:40,040 --> 00:33:43,960 >> Y por lo que parece se está pasando de intercambio 763 00:33:43,960 --> 00:33:48,980 x-- conocido como A-- y es se pasa Y- conocido como b. 764 00:33:48,980 --> 00:33:51,900 De alguna manera, estas tres líneas son el canje de esos valores exactamente 765 00:33:51,900 --> 00:33:53,510 como Lauren hizo con la leche y zumo de naranja. 766 00:33:53,510 --> 00:33:56,010 Pero cuando imprimimos los valores, a y b 767 00:33:56,010 --> 00:34:01,340 son de hecho cambiar pero xy Y tienen ningún cambio a ellos. 768 00:34:01,340 --> 00:34:03,150 Recordemos que x e y son aquí. 769 00:34:03,150 --> 00:34:05,320 >> Así que podemos ver esto a través de Otra técnica también. 770 00:34:05,320 --> 00:34:08,110 Y esto también es una técnica incrustado en un problema establecido tres. 771 00:34:08,110 --> 00:34:10,780 Vamos a seguir adelante y hacer esto en CS50 Identificación si usted no tiene ya. 772 00:34:10,780 --> 00:34:13,730 En el lado derecho que tener esta pestaña depurador. 773 00:34:13,730 --> 00:34:16,159 Y si abre esto, hay algo de información arcana 774 00:34:16,159 --> 00:34:17,530 eso es lanzado en usted al principio. 775 00:34:17,530 --> 00:34:19,310 Pero vamos a burlan de esto aparte muy rápido. 776 00:34:19,310 --> 00:34:21,620 >> Así que uno, ver las variables locales. 777 00:34:21,620 --> 00:34:26,230 Resulta que construir en IDE CS50, y una gran cantidad de entornos de programación más 778 00:34:26,230 --> 00:34:28,060 en general, es un depurador. 779 00:34:28,060 --> 00:34:31,340 Una herramienta que te permite ver visualmente lo que está pasando dentro de su programa 780 00:34:31,340 --> 00:34:34,380 sin tener que recurrir a la adición printfs y compilar y ejecutar 781 00:34:34,380 --> 00:34:37,588 y la adición de printf y compilar y correr, que ya, en horario de oficina 782 00:34:37,588 --> 00:34:40,070 o en el hogar, es probable que haciendo bastante tedioso. 783 00:34:40,070 --> 00:34:43,090 >> Así que aquí, en un momento, estamos va a ver en tiempo real 784 00:34:43,090 --> 00:34:44,760 los valores de nuestras variables locales. 785 00:34:44,760 --> 00:34:47,880 También vamos a ser capaces de establecer los llamados puntos de ruptura que 786 00:34:47,880 --> 00:34:52,570 oportunidades en mi programa para hacer una pausa ejecución en una línea específica de código 787 00:34:52,570 --> 00:34:53,710 que tengo curiosidad por saber. 788 00:34:53,710 --> 00:34:54,210 ¿Correcto? 789 00:34:54,210 --> 00:34:55,969 Estos programas se ejecutan en una fracción de segundo. 790 00:34:55,969 --> 00:35:00,450 Es un poco agradable para nosotros los seres humanos más lentas para ser capaz de hacer una pausa, tomar un momento, consulte 791 00:35:00,450 --> 00:35:02,380 lo que está sucediendo a su alrededor una cierta línea de código 792 00:35:02,380 --> 00:35:05,050 sin el arado programa a través de él y acabado por completo. 793 00:35:05,050 --> 00:35:08,510 Así que a los puntos de ruptura nos va a permitir a romper y hacer una pausa en un punto determinado. 794 00:35:08,510 --> 00:35:12,990 >> Pila de llamadas es una forma elegante de diciendo qué funciones son actualmente 795 00:35:12,990 --> 00:35:14,140 siendo llamado en el momento. 796 00:35:14,140 --> 00:35:15,370 Principal se llama siempre primero. 797 00:35:15,370 --> 00:35:17,230 Pero si Principal llama función denominada Swap, 798 00:35:17,230 --> 00:35:20,470 estamos en realidad va a ver esto Torre de las funciones que han sido 799 00:35:20,470 --> 00:35:22,400 llamada en orden cronológico inverso. 800 00:35:22,400 --> 00:35:23,310 Así que vamos a ver eso. 801 00:35:23,310 --> 00:35:24,327 >> Me voy a alejar. 802 00:35:24,327 --> 00:35:25,660 Voy a volver a mi código. 803 00:35:25,660 --> 00:35:27,540 Y sólo porque quiero ser pedante aquí, 804 00:35:27,540 --> 00:35:31,100 Voy a seguir adelante y haga clic justo a la izquierda de la línea cinco. 805 00:35:31,100 --> 00:35:32,830 Y eso crea un punto rojo. 806 00:35:32,830 --> 00:35:36,200 Y note en el lado derecho que el depurador sabe, bueno, 807 00:35:36,200 --> 00:35:41,020 Que acabo de decir un punto de interrupción en línea noswap.c cinco, específicamente 808 00:35:41,020 --> 00:35:42,480 en esta línea de código. 809 00:35:42,480 --> 00:35:45,090 Así que el depurador sabe que yo han solicitado que la próxima vez 810 00:35:45,090 --> 00:35:48,530 Tengo mi programa se pausa ejecución no en lugar de sólo 811 00:35:48,530 --> 00:35:50,390 corriendo todo super rápido. 812 00:35:50,390 --> 00:35:53,889 >> Así que ahora voy a hacer clic en el Depurar botón en la parte superior del IDE 813 00:35:53,889 --> 00:35:55,430 y eso va a hacer lo siguiente. 814 00:35:55,430 --> 00:36:00,680 Se va a abrir un principio algo miedo segundo terminal mirando window-- 815 00:36:00,680 --> 00:36:02,679 depuración remota desde acoger tal y tal-- 816 00:36:02,679 --> 00:36:04,970 y vamos a volver a lo que todo lo que significa en poco tiempo. 817 00:36:04,970 --> 00:36:09,020 Pero lo que es importante, por ahora es que ese punto rojo fue golpeado, 818 00:36:09,020 --> 00:36:11,735 el depurador tiene deliberadamente pausa execution-- 819 00:36:11,735 --> 00:36:15,560 no en esa línea en sí, sino en la primera línea de código real en esa función. 820 00:36:15,560 --> 00:36:18,040 Y por eso la línea siete es ahora resaltado en amarillo. 821 00:36:18,040 --> 00:36:20,550 >> Y ahora vamos a echar un vistazo en el lado derecho. 822 00:36:20,550 --> 00:36:27,300 Parece que, por defecto, lo suficientemente bien, x tiene lo que de valor? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 E y tiene lo que de valor? 825 00:36:29,750 --> 00:36:30,410 Cero. 826 00:36:30,410 --> 00:36:35,540 Y eso es de esperar en el sentido que x e Y- que line-- amarilla tiene 827 00:36:35,540 --> 00:36:36,770 aún no ejecutado. 828 00:36:36,770 --> 00:36:38,510 Así que x no deben tener el valor 1. 829 00:36:38,510 --> 00:36:41,470 Podría tener cualquier otro valor, un valor llamado de basura. 830 00:36:41,470 --> 00:36:44,320 Y tenemos la suerte de que es cero en este punto, esencialmente. 831 00:36:44,320 --> 00:36:46,400 >> Así que ahora sólo hay unos pocos botones tenemos que cuidar 832 00:36:46,400 --> 00:36:48,100 acerca al depurar de esta manera. 833 00:36:48,100 --> 00:36:49,970 Nótese aquí, tenemos un botón Reproducir. 834 00:36:49,970 --> 00:36:51,877 Y si jugamos o golpear reanudar, eso es sólo 835 00:36:51,877 --> 00:36:53,710 va a ejecutar a través de el resto del programa 836 00:36:53,710 --> 00:36:55,300 o hasta que choca con otro punto de interrupción. 837 00:36:55,300 --> 00:36:56,910 Pero yo no he puesto ningún otro puntos de ruptura por lo que es justo 838 00:36:56,910 --> 00:36:58,118 va a correr hasta el final. 839 00:36:58,118 --> 00:37:00,280 Ese tipo de derrotas las propósito de hurgar. 840 00:37:00,280 --> 00:37:03,290 >> Así que en vez, me importa estos iconos a la derecha. 841 00:37:03,290 --> 00:37:05,360 Y si se ciernen sobre ellos, como se debe también, 842 00:37:05,360 --> 00:37:07,450 verás pequeños consejos herramienta tips--. 843 00:37:07,450 --> 00:37:09,020 Este es un paso más. 844 00:37:09,020 --> 00:37:11,290 Ahora eso no significa salto la siguiente línea de código. 845 00:37:11,290 --> 00:37:14,840 Eso sólo significa ejecutarlo y pasar a la siguiente, pasar a la siguiente, 846 00:37:14,840 --> 00:37:15,580 pasar a la siguiente. 847 00:37:15,580 --> 00:37:17,610 En otras palabras, a través de ese botón, puedo caminar 848 00:37:17,610 --> 00:37:20,390 a través de mi código de un paso a la vez. 849 00:37:20,390 --> 00:37:21,914 Línea por línea, literalmente. 850 00:37:21,914 --> 00:37:23,830 Ahora, a la derecha de eso, hay otro 851 00:37:23,830 --> 00:37:25,163 que veremos en un momento. 852 00:37:25,163 --> 00:37:27,820 Esta es la llamada Step Into icono que es 853 00:37:27,820 --> 00:37:30,300 me va a permitir buceo en otra función. 854 00:37:30,300 --> 00:37:31,800 Pero vamos a ver esto en un momento. 855 00:37:31,800 --> 00:37:33,280 Así que voy a hacer clic pasar por encima. 856 00:37:33,280 --> 00:37:35,820 Y ahora note, como hago clic este botón en la parte superior derecha, 857 00:37:35,820 --> 00:37:41,260 mantener los ojos más o menos bajo Local Variables y ver qué sucede con x. 858 00:37:41,260 --> 00:37:44,115 x es ahora 1 porque el línea amarilla se ha ejecutado 859 00:37:44,115 --> 00:37:45,840 y nos hemos trasladado a la línea 8. 860 00:37:45,840 --> 00:37:49,840 Y en un momento y esperemos que debería convertirse 2. 861 00:37:49,840 --> 00:37:52,330 >> Ahora, nada tan interesante que pasa por un poco. 862 00:37:52,330 --> 00:37:53,390 Todo esto es es printf. 863 00:37:53,390 --> 00:37:58,010 Y cuenta, en mi terminal secundaria ventana, veo la salida de definición de impresión. 864 00:37:58,010 --> 00:38:01,080 Y ahora tengo que hacer una decisión del programador. 865 00:38:01,080 --> 00:38:04,360 Puedo pasar por encima de esta línea de código, ejecutarlo, pero no 866 00:38:04,360 --> 00:38:06,220 conseguir curioso sobre lo que hay dentro. 867 00:38:06,220 --> 00:38:11,130 O puedo paso realmente en él e ir dentro de Intercambio de sí mismo. 868 00:38:11,130 --> 00:38:12,340 Así que vamos a hacer el segundo. 869 00:38:12,340 --> 00:38:15,550 >> Déjame ir adelante y haga clic en No Step Over pero Step Into. 870 00:38:15,550 --> 00:38:17,300 Aviso, de repente, los cambios en las ventanas 871 00:38:17,300 --> 00:38:19,330 para resaltar la primera línea de código en Cambiar. 872 00:38:19,330 --> 00:38:20,710 Esa es la línea 21. 873 00:38:20,710 --> 00:38:25,220 Y ahora, ¿qué clase de cobarde es que, si se mira por aquí, como se esperaba, 874 00:38:25,220 --> 00:38:29,720 una coma b es 1 y 2, respectivamente. 875 00:38:29,720 --> 00:38:33,840 ¿Por qué es temp 32767? 876 00:38:33,840 --> 00:38:36,560 Recordando que la temperatura, al igual que la taza vacía hace un momento, 877 00:38:36,560 --> 00:38:38,980 se declara aquí en la línea 21. 878 00:38:38,980 --> 00:38:43,390 ¿Por qué 32.000 Quiero decir, ¿por qué es sólo algún valor raro? 879 00:38:43,390 --> 00:38:43,890 ¿Sí? 880 00:38:43,890 --> 00:38:45,190 >> AUDIENCIA: No es inicializado. 881 00:38:45,190 --> 00:38:46,940 >> DAVID J. MALAN: Es No ha inicializado. 882 00:38:46,940 --> 00:38:49,370 Así que nuestro equipo siempre tiene memoria física. 883 00:38:49,370 --> 00:38:50,544 Inclusive de RAM física. 884 00:38:50,544 --> 00:38:52,710 Y siempre de cero y uno está ahí, ¿verdad? 885 00:38:52,710 --> 00:38:54,626 Debido a que estamos usando nuestra computadora todo el día, 886 00:38:54,626 --> 00:38:57,210 está utilizando el CS50 IDE o los servidores de todo el día. 887 00:38:57,210 --> 00:39:01,159 Así que la memoria RAM o bien tiene algunos ceros o alguien de o algunos ceros y unos. 888 00:39:01,159 --> 00:39:02,950 No importa si es o no los estés usando. 889 00:39:02,950 --> 00:39:05,270 No se puede tener en blanco espacios en los que quieren bits. 890 00:39:05,270 --> 00:39:06,850 Son ya sea ceros y unos. 891 00:39:06,850 --> 00:39:09,610 >> Así resulta que la temperatura, ya que no hemos inicializado todavía, 892 00:39:09,610 --> 00:39:14,580 tenemos esos 32 bits, pero no he ha inicializado a los valores conocidos. 893 00:39:14,580 --> 00:39:18,110 Así que lo que fueran más recientemente utilizado para-- los 32 bits-- 894 00:39:18,110 --> 00:39:23,000 sólo estamos viendo los artefactos de algunos uso previo de aquellos particulares 32 895 00:39:23,000 --> 00:39:23,500 pedacitos. 896 00:39:23,500 --> 00:39:27,780 Tan pronto como haga clic en Paso a paso por embargo, uf, temperatura se va a poner el valor 1. 897 00:39:27,780 --> 00:39:31,600 Y si lo hago de nuevo, a es va a ser dado el valor 2 898 00:39:31,600 --> 00:39:33,830 y luego b va a ser dado el valor 1. 899 00:39:33,830 --> 00:39:36,390 >> Y así, lo que es bueno ahora en este punto de la historia 900 00:39:36,390 --> 00:39:39,750 es que el depurador es mostrándome, super lenta 901 00:39:39,750 --> 00:39:42,640 a mi propio ritmo, lo que el estado de Swap es. 902 00:39:42,640 --> 00:39:47,490 Pero fíjate en la parte superior aquí, previo aviso que la pila de llamadas en realidad 903 00:39:47,490 --> 00:39:49,180 tiene dos capas a la misma. 904 00:39:49,180 --> 00:39:53,240 Ahora el que ha destacado como Swap, si hago clic en Principal lugar, 905 00:39:53,240 --> 00:39:57,100 observe cómo cambian las variables locales debido a que el desarrollador puede simplemente hop 906 00:39:57,100 --> 00:39:59,740 vuelta y entrar en cualquier ámbito diferente. 907 00:39:59,740 --> 00:40:04,070 Así que a pesar de que estamos haciendo todo esto trabajar e intercambiar correctamente a y b, 908 00:40:04,070 --> 00:40:09,080 si voy a ir y venir entre Permuta donde a es 2 y b es 1 y Main, 909 00:40:09,080 --> 00:40:11,851 ha Principal visto afectada en absoluto? 910 00:40:11,851 --> 00:40:12,350 No. 911 00:40:12,350 --> 00:40:13,930 ¿Cuál es la comida para llevar en esta lista? 912 00:40:13,930 --> 00:40:18,200 Bueno, resulta que cualquier momento se llama a una función como Swap, 913 00:40:18,200 --> 00:40:21,600 y se le pasa argumentos, lo que estás pasando a la función swap 914 00:40:21,600 --> 00:40:24,730 en este caso es una copia de esos argumentos. 915 00:40:24,730 --> 00:40:28,620 Así que si x e y son cada uno, respectivamente 32 bits, lo swap es conseguir 916 00:40:28,620 --> 00:40:30,760 es dos nuevos locales variables o argumentos, 917 00:40:30,760 --> 00:40:34,380 llamado y B-- pero aquellos son arbitrarias nombres-- pero el patrón de ceros 918 00:40:34,380 --> 00:40:39,520 y queridos en el interior de A y B son fila para ser idéntica a x e y 919 00:40:39,520 --> 00:40:42,610 pero no son la lo mismo que x e y. 920 00:40:42,610 --> 00:40:46,880 >> Es como si tiene Principal en su pedazo de papel el número 1 y 2 para x e y, 921 00:40:46,880 --> 00:40:49,260 y luego cuando manos que pedazo de papel para intercambio, 922 00:40:49,260 --> 00:40:51,970 Intercambiar pone muy rápidamente su propia pluma, escribe 923 00:40:51,970 --> 00:40:56,240 1 y 2 en su propia hoja de papel, manos atrás xy original Principal 924 00:40:56,240 --> 00:40:58,790 y luego hace su propia cosa con a y b. 925 00:40:58,790 --> 00:41:01,940 Y ahora esto es super importante porque esto tiene implicaciones no triviales 926 00:41:01,940 --> 00:41:06,260 para realmente escribir código correcto porque parecería que no podemos cambiar 927 00:41:06,260 --> 00:41:07,500 dos variables. 928 00:41:07,500 --> 00:41:09,150 >> He escrito una función Intercambiar correcta. 929 00:41:09,150 --> 00:41:12,770 Hemos implementado con Lauren como una función de intercambio correcto en la realidad, 930 00:41:12,770 --> 00:41:16,700 pero aparentemente nada de eso asuntos si no puede en realidad 931 00:41:16,700 --> 00:41:19,530 intercambiar dos valores de forma permanente. 932 00:41:19,530 --> 00:41:21,970 Así que tenemos otra manera para conseguir realmente en esto, 933 00:41:21,970 --> 00:41:24,472 y tenemos que ser capaces de realmente resolver este problema. 934 00:41:24,472 --> 00:41:27,180 Y resulta fuera-- y nos va a venir volver a esta imagen en particular 935 00:41:27,180 --> 00:41:30,500 antes long-- esta es una manera de que puede dibujar la memoria del equipo. 936 00:41:30,500 --> 00:41:31,460 Es sólo un rectángulo. 937 00:41:31,460 --> 00:41:32,960 Usted podría dibujar cualquier número de maneras, pero es 938 00:41:32,960 --> 00:41:35,740 conveniente para dibujar como un rectángulo por la siguiente razón. 939 00:41:35,740 --> 00:41:40,040 >> Vamos a empezar hoy y más allá hablando de la llamada pila. 940 00:41:40,040 --> 00:41:43,870 Y la pila es sólo un trozo de RAM-- un trozo de memory-- 941 00:41:43,870 --> 00:41:47,100 funciones que tienen acceso cuando se les llama. 942 00:41:47,100 --> 00:41:49,800 Y así resulta que en la parte inferior de esta pila 943 00:41:49,800 --> 00:41:53,590 es donde todas las variables locales de principales y org C y org V y todas esas cosas 944 00:41:53,590 --> 00:41:56,950 se va a ir de forma predeterminada. Y si Principal pide alguna otra función como Swap, 945 00:41:56,950 --> 00:42:00,330 así, Traga va a conseguir otra capa de la memoria por encima de ella. 946 00:42:00,330 --> 00:42:04,490 >> Y por lo que acaba de darle una somera rápida foto de esto, si yo voy aquí-- 947 00:42:04,490 --> 00:42:09,450 y dejé mi Espejo esto en el los gastos generales como bien-- lo que realmente tengo, 948 00:42:09,450 --> 00:42:12,100 si nos preocupamos sólo de la parte inferior de esta imagen, por ahora, 949 00:42:12,100 --> 00:42:15,070 es que cuando ejecuto un programa de y Main se llama, 950 00:42:15,070 --> 00:42:18,330 Principal se le da un trozo de RAM en mi equipo que es 951 00:42:18,330 --> 00:42:20,060 en la parte inferior de esta llamada pila. 952 00:42:20,060 --> 00:42:22,143 Y yo voy a dibujarlo deliberadamente como un cuadrado. 953 00:42:22,143 --> 00:42:24,540 Así que es como 32 bits o cuatro bytes. 954 00:42:24,540 --> 00:42:28,790 Y si esta función principal tiene una variable llamada x con un valor de 1 955 00:42:28,790 --> 00:42:32,626 y tiene una variable llamada y con el valor de 2, que es 956 00:42:32,626 --> 00:42:35,750 como tomar esta astilla de memoria que Principal ha sido propuesta por el operativo 957 00:42:35,750 --> 00:42:38,850 sistema y dividiéndolo de modo que la primera variable local va aquí, 958 00:42:38,850 --> 00:42:40,930 el segundo va aquí, y eso es todo. 959 00:42:40,930 --> 00:42:45,590 >> Cuando principal llama Swap, Intercambiar obtiene su propio trozo de la memoria 960 00:42:45,590 --> 00:42:48,280 que vamos a dibujar como este desde el sistema operativo, 961 00:42:48,280 --> 00:42:50,820 y que va a tener su variables locales propios basados 962 00:42:50,820 --> 00:42:53,825 en nuestra aplicación anterior con variables locales una 963 00:42:53,825 --> 00:42:58,010 y b que en un principio obtener los valores 1 y 2. 964 00:42:58,010 --> 00:43:00,450 Pero entonces, tan pronto como sea el código de Swap ejecuta, 965 00:43:00,450 --> 00:43:03,760 y Lauren realidad intercambia el DO y la leche, lo que está pasando? 966 00:43:03,760 --> 00:43:09,030 Pues bien, este 2 está convirtiendo en un 1, este 1 está convirtiendo en un 2, y, por cierto, 967 00:43:09,030 --> 00:43:13,360 hay una variable temporal que está siendo usado todo ese tiempo que con el tiempo 968 00:43:13,360 --> 00:43:14,470 se va. 969 00:43:14,470 --> 00:43:16,720 Pero no importa la cantidad de trabajo que usted hace 970 00:43:16,720 --> 00:43:22,160 en esta línea de-- en este espacio de memoria, x e y son completamente intacta. 971 00:43:22,160 --> 00:43:26,320 >> Así que necesitamos alguna manera de dar Intercambiar y funciona como si 972 00:43:26,320 --> 00:43:32,640 acceso secreto, si se quiere, a funciones como-- a la memoria como x e y. 973 00:43:32,640 --> 00:43:35,110 Así que echemos un vistazo a un ejemplo que ayuda 974 00:43:35,110 --> 00:43:38,220 a ver exactamente lo que ha estado pasando todo este tiempo. 975 00:43:38,220 --> 00:43:40,284 Voy a seguir adelante y abrir Comparar Cero. 976 00:43:40,284 --> 00:43:42,200 Y yo voy a cerrar nuestra depurador, voy 977 00:43:42,200 --> 00:43:44,360 para cerrar este mensaje en busca de miedo los justos dice, espera un minuto, 978 00:43:44,360 --> 00:43:45,800 estás en la depuración media. 979 00:43:45,800 --> 00:43:48,383 Voy a ocultar esta pestaña aquí sólo para volver a la simplicidad. 980 00:43:48,383 --> 00:43:50,160 Así que no te preocupes si GDB es asesinado. 981 00:43:50,160 --> 00:43:53,910 Eso sólo significa que el programa tiene sido dejar de fumar, deliberadamente, en este caso, 982 00:43:53,910 --> 00:43:54,820 De mi. 983 00:43:54,820 --> 00:43:57,700 >> Y ahora Comparar Zero hace esto. 984 00:43:57,700 --> 00:44:00,110 Estoy usando el CS50 biblioteca de E / S estándar. 985 00:44:00,110 --> 00:44:04,319 Tengo una función principal que primero dice, dicen algo, y obtiene una cadena. 986 00:44:04,319 --> 00:44:06,110 Luego dice una y otra consigue otra cadena. 987 00:44:06,110 --> 00:44:09,910 Y notar que estas dos cadenas se llaman s y t, respectivamente. 988 00:44:09,910 --> 00:44:12,910 Y ahora este programa, Comparar Zero, su propósito en la vida, 989 00:44:12,910 --> 00:44:15,470 se supone que me dicen, lo escribo lo mismo? 990 00:44:15,470 --> 00:44:16,910 Y así me voy a volver a la semana uno. 991 00:44:16,910 --> 00:44:19,950 Estoy usando mi operador de igualdad iguales que es el operador de la calidad. 992 00:44:19,950 --> 00:44:22,220 No es el operador de asignación, el operador de igualdad. 993 00:44:22,220 --> 00:44:23,890 Sólo estoy comparando s y t. 994 00:44:23,890 --> 00:44:27,470 >> Así que vamos a realmente seguir adelante y hacer esto. 995 00:44:27,470 --> 00:44:32,680 Y voy a seguir adelante y hacer comparación Cero. 996 00:44:32,680 --> 00:44:35,110 Yo voy a hacer ./comparezero. 997 00:44:35,110 --> 00:44:37,150 Y yo voy a ir adelante y decir algo 998 00:44:37,150 --> 00:44:43,450 como, vamos a hacer mamá en minúsculas y ¿qué hay de la mamá en mayúsculas. 999 00:44:43,450 --> 00:44:45,034 Y por supuesto que escribo cosas diferentes. 1000 00:44:45,034 --> 00:44:45,533 Correcto. 1001 00:44:45,533 --> 00:44:46,570 Eso es de esperar. 1002 00:44:46,570 --> 00:44:47,640 >> Vamos a correr de nuevo. 1003 00:44:47,640 --> 00:44:49,740 Las dos veces lo hacen en minúscula, minúscula. 1004 00:44:49,740 --> 00:44:51,490 Eso se ve súper idéntica a mí. 1005 00:44:51,490 --> 00:44:52,930 Intro. 1006 00:44:52,930 --> 00:44:53,430 OK. 1007 00:44:53,430 --> 00:44:55,804 Tal vez es sólo raro porque no está gustando mi gramática. 1008 00:44:55,804 --> 00:44:59,930 Así que vamos a hacer un MOM de capital, capital de MOM, idénticos. 1009 00:44:59,930 --> 00:45:01,490 Cosas diferentes. 1010 00:45:01,490 --> 00:45:03,907 >> Entonces ¿por qué es eso? 1011 00:45:03,907 --> 00:45:06,240 Bueno, lo que realmente está pasando de debajo del capó aquí? 1012 00:45:06,240 --> 00:45:08,180 Así que vamos a volver más aquí por un momento 1013 00:45:08,180 --> 00:45:10,910 y considerar lo GetString es en realidad haciendo. 1014 00:45:10,910 --> 00:45:13,385 Cuando se llama a GetString, que es una función que 1015 00:45:13,385 --> 00:45:16,510 nos escribió y que llega de alguna manera una secuencia de caracteres del usuario. 1016 00:45:16,510 --> 00:45:20,280 Y vamos a suponer que la primera vez que llamo GetString, eso me da 1017 00:45:20,280 --> 00:45:21,930 un trozo de memoria que se parece a esto. 1018 00:45:21,930 --> 00:45:26,990 Y si he escrito en minúsculas m-o-M-- y lo que va después de él? 1019 00:45:26,990 --> 00:45:28,840 Sólo una comprobación de validez rápido. 1020 00:45:28,840 --> 00:45:29,780 >> Cero barra invertida. 1021 00:45:29,780 --> 00:45:30,510 Lo sabemos. 1022 00:45:30,510 --> 00:45:32,784 Y recordamos que jugamos todo con el nombre de Zamila 1023 00:45:32,784 --> 00:45:34,950 y un montón de otros nombres cuando Rob estaba aquí buscando 1024 00:45:34,950 --> 00:45:36,280 a lo que está pasando dentro de la memoria. 1025 00:45:36,280 --> 00:45:37,780 Así que la historia es exactamente la misma. 1026 00:45:37,780 --> 00:45:40,160 Esto es lo que GetString está volviendo a mí. 1027 00:45:40,160 --> 00:45:44,780 Ahora, mi código hace un momento almacena el valor de retorno de GetString 1028 00:45:44,780 --> 00:45:47,510 en una variable llamada s. 1029 00:45:47,510 --> 00:45:51,390 Y entonces la segunda vez que me llamaba, se almacena en una variable llamada t. 1030 00:45:51,390 --> 00:45:55,070 >> Así que si me voy de aquí, necesito para dibujar este variable-- locales 1031 00:45:55,070 --> 00:45:59,610 y estoy por lo general va a dibujar una cadena como sólo-- vamos 1032 00:45:59,610 --> 00:46:02,360 llamarlo s-- como una pequeña plaza aquí. 1033 00:46:02,360 --> 00:46:09,760 Y ahora, ¿cómo somehow-- mamá ir dentro de esta variable s? 1034 00:46:09,760 --> 00:46:12,010 Bueno, tenemos que volver a los primeros principios aquí. 1035 00:46:12,010 --> 00:46:15,660 ¿Qué está GetString realidad regresaba? 1036 00:46:15,660 --> 00:46:19,030 >> Así resulta que M-O-M barra invertida cero, y cualquier número 1037 00:46:19,030 --> 00:46:22,364 de otras cadenas en memoria como Zamila y Rob o Andy o cualesquiera otros, 1038 00:46:22,364 --> 00:46:24,280 son, por supuesto, en nuestro RAM o memoria de ordenador. 1039 00:46:24,280 --> 00:46:27,760 Y la memoria RAM tiene como-- tienes un giga de RAM, dos gigas de RAM, 1040 00:46:27,760 --> 00:46:30,860 o mil millones o dos mil millones de bytes, o tal vez aún más en estos días. 1041 00:46:30,860 --> 00:46:34,070 Así que vamos a suponer, para los propósitos de la actualidad, que no importa cómo numeramos 1042 00:46:34,070 --> 00:46:36,640 ellos, pero podemos numerar cada de los mil millones o dos mil millones de 1043 00:46:36,640 --> 00:46:37,880 o cuatro mil millones de bytes. 1044 00:46:37,880 --> 00:46:42,240 >> Y digamos que arbitrariamente que esta es la primera picadura, mordedura segundos, 1045 00:46:42,240 --> 00:46:43,380 tercero cuarto. 1046 00:46:43,380 --> 00:46:46,570 Deliberadamente no estoy usando cero para hoy, pero vamos a volver a eso. 1047 00:46:46,570 --> 00:46:49,570 Así, en otras palabras, si este es el primera vez que estoy usando el programa, 1048 00:46:49,570 --> 00:46:52,715 Sólo estoy teniendo suerte y la primera mordedura es en la ubicación a una y luego dos 1049 00:46:52,715 --> 00:46:53,590 luego tres de cuatro. 1050 00:46:53,590 --> 00:46:57,430 Y si seguía dibujo, número de la caja dos mil millones sería hasta aquí. 1051 00:46:57,430 --> 00:47:02,200 >> Entonces, ¿qué piensa usted, entonces, GetString realidad regresa? 1052 00:47:02,200 --> 00:47:06,010 No está volviendo H-O-H barra invertida cero per se, ya que claramente 1053 00:47:06,010 --> 00:47:08,180 no caben en la caja que he dibujado. 1054 00:47:08,180 --> 00:47:11,210 Entonces, ¿qué otra cosa podría GetString realidad Volveremos todas estas semanas? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 La respuesta está en el tablero de aquí en alguna parte. 1057 00:47:16,820 --> 00:47:20,390 No puede caber H-O-H barra invertida cero, así que lo que podría tener sentido en su lugar? 1058 00:47:20,390 --> 00:47:23,424 Si tuviera que ser super inteligente, poniendo en el denominado sombrero de ingeniería, 1059 00:47:23,424 --> 00:47:24,340 ¿qué podrías volver? 1060 00:47:24,340 --> 00:47:27,340 ¿Cuál es la menor cantidad de información usted podría volver que haría aún 1061 00:47:27,340 --> 00:47:30,610 le permiten encontrar M-O-M en la memoria? 1062 00:47:30,610 --> 00:47:31,270 ¿Sí? 1063 00:47:31,270 --> 00:47:31,950 >> AUDIENCIA: Uno. 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J. MALAN: One. 1065 00:47:32,200 --> 00:47:33,021 ¿Y por qué uno? 1066 00:47:33,021 --> 00:47:35,520 AUDIENCIA: Porque sería decirle a donde vayas [inaudible]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J. MALAN: Exactamente. 1069 00:47:39,390 --> 00:47:44,300 Yo sólo voy a devolver la dirección de la cadena que he conseguido. 1070 00:47:44,300 --> 00:47:46,570 La dirección de esta caso es ubicación a una. 1071 00:47:46,570 --> 00:47:51,280 Así que lo que realmente está siendo almacenada en s-- y cada variable de cadena tanto far-- 1072 00:47:51,280 --> 00:47:53,430 simplemente ha sido el dirección de esa cadena. 1073 00:47:53,430 --> 00:47:57,840 >> Mientras tanto, si llamo GetString una segunda vez y yo 1074 00:47:57,840 --> 00:48:03,300 escribir, literalmente, la misma cosa-- M-O-M con lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 y otra barra invertida cero, y ahora tal vez mi programa de 1076 00:48:06,200 --> 00:48:09,820 estado funcionando durante algún tiempo así que quizás esto es 10, esto es la ubicación 11, esto es 12, 1077 00:48:09,820 --> 00:48:10,700 esto es 13. 1078 00:48:10,700 --> 00:48:13,590 Los equipos que utilizan algún otro memoria por cualquier razón. 1079 00:48:13,590 --> 00:48:18,172 ¿Y ahora qué pasa en mi segundo variable en mi programa de t? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Exactamente. 1082 00:48:20,050 --> 00:48:23,910 >> Y así, cuando nos fijamos en la código fuente de este programa 1083 00:48:23,910 --> 00:48:26,550 donde yo simplemente estoy tratando para comparar los dos valores, 1084 00:48:26,550 --> 00:48:32,180 es S igual igual at, ¿cuál es la respuesta humana obvio? 1085 00:48:32,180 --> 00:48:34,890 Así que no, porque 1 no es igual a 10. 1086 00:48:34,890 --> 00:48:36,861 Y así, en este documento se encuentra un oportunidad para nosotros de verdad 1087 00:48:36,861 --> 00:48:39,610 que sólo tiene que ir de nuevo a, de nuevo, primero principios y pensar, bueno, 1088 00:48:39,610 --> 00:48:41,110 lo que está pasando debajo de la campana? 1089 00:48:41,110 --> 00:48:43,240 Hemos estado hablando acerca de bits y bytes y la memoria, 1090 00:48:43,240 --> 00:48:46,820 pero en realidad es útil para entender porque cuando usted llama GetString, 1091 00:48:46,820 --> 00:48:50,280 a pesar de que pensamos que es regresar H-O-H o cadena mamá 1092 00:48:50,280 --> 00:48:53,120 o Andy o Zamila o similares, técnicamente 1093 00:48:53,120 --> 00:48:55,510 es sólo devolver la dirección de esa parte de la memoria. 1094 00:48:55,510 --> 00:48:56,910 >> Pero eso esta bien. 1095 00:48:56,910 --> 00:49:00,570 Porque ¿cómo sé donde termina la cadena? 1096 00:49:00,570 --> 00:49:03,840 Si tan sólo me dan el principio? 1097 00:49:03,840 --> 00:49:05,380 Bueno, la barra invertida cero, ¿no? 1098 00:49:05,380 --> 00:49:08,800 Justo a tiempo lineal que pueda imprimir con definición de impresión M-O-M. 1099 00:49:08,800 --> 00:49:11,820 Y tan pronto como veo barra invertida cero, no me importa donde empecé, 1100 00:49:11,820 --> 00:49:14,950 Ya sé implícitamente donde tengo que terminar. 1101 00:49:14,950 --> 00:49:18,700 >> Y por lo que hoy se cumple el beginning-- y déjame hacer esto de forma espectacular porque nos 1102 00:49:18,700 --> 00:49:21,800 pasó por un montón de problemas para conseguir éstos aquí entrenando wheels-- 1103 00:49:21,800 --> 00:49:29,840 por lo que hoy las ruedas de entrenamiento comienzan a desprenderse y nos revelan por lo menos: 1104 00:49:29,840 --> 00:49:31,373 >> [Aplausos] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> Eso fue bien vale la pena el viaje a Target esta mañana, ¿no? 1107 00:49:36,160 --> 00:49:39,600 Así ahora-- existe, resulta cabo, no hay tal cosa como una cadena. 1108 00:49:39,600 --> 00:49:41,140 Cadena no existe. 1109 00:49:41,140 --> 00:49:43,760 Es un sinónimo que hemos tenido en el interior de la biblioteca CS50. 1110 00:49:43,760 --> 00:49:48,660 De ahora en adelante, vamos a empezar a llamar s y t no secuencias pero estrellas Char. 1111 00:49:48,660 --> 00:49:51,180 Y la estrella carbón vamos desmenuzar poco tiempo. 1112 00:49:51,180 --> 00:49:53,510 Pero esto es decir, que incluso si continuamos 1113 00:49:53,510 --> 00:49:56,180 utilizando GetString por ahora, técnicamente que debería 1114 00:49:56,180 --> 00:49:59,010 estar diciendo estrellas carbón y la estrella de carbón. 1115 00:49:59,010 --> 00:50:01,720 >> Y resulta que lo que la estrella va a significar algo 1116 00:50:01,720 --> 00:50:04,340 llamado un puntero o una dirección. 1117 00:50:04,340 --> 00:50:06,110 Y, de hecho, un teaser para lo que se avecina 1118 00:50:06,110 --> 00:50:09,760 es ese 20 segundo clip de nuestra amigo Nick Parlante en Stanford 1119 00:50:09,760 --> 00:50:12,927 que, hace bastante tiempo, pasar una cantidad ridícula de tiempo, 1120 00:50:12,927 --> 00:50:15,010 lo mejor que puedo decir en su cocina o el sótano de su casa, 1121 00:50:15,010 --> 00:50:17,140 hacer animación con plastilina introducción al mundo 1122 00:50:17,140 --> 00:50:20,010 un personaje llamado Binky con los que va a 1123 00:50:20,010 --> 00:50:22,010 se introducirá la próxima vez para los punteros. 1124 00:50:22,010 --> 00:50:24,588 Así que aquí es un adelanto de lo que está por venir. 1125 00:50:24,588 --> 00:50:26,370 >> [REPRODUCCIÓN DE VÍDEO] 1126 00:50:26,370 --> 00:50:27,510 >> -Oye, Binky. 1127 00:50:27,510 --> 00:50:28,260 Despertarse. 1128 00:50:28,260 --> 00:50:30,672 Es tiempo para la diversión puntero. 1129 00:50:30,672 --> 00:50:31,616 >> -¿Que es eso? 1130 00:50:31,616 --> 00:50:33,032 Entérese de los punteros? 1131 00:50:33,032 --> 00:50:34,450 Oh, chuchería. 1132 00:50:34,450 --> 00:50:35,431 >> [FIN DE REPRODUCCIÓN] 1133 00:50:35,431 --> 00:50:38,055 DAVID J. MALAN: Y en esa nota, nos vemos el miércoles. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 Correcto. 1136 00:50:48,090 --> 00:50:48,740 ¿Quién es el baile? 1137 00:50:48,740 --> 00:50:49,240 Vamos. 1138 00:50:49,240 --> 00:50:50,330 ¿Quién es el baile? 1139 00:50:50,330 --> 00:50:51,820 ¿Quieres que ponerlo en marcha? 1140 00:50:51,820 --> 00:50:53,770 Voy a ponerlo en marcha. 1141 00:50:53,770 --> 00:50:54,270 Woooo! 1142 00:50:54,270 --> 00:51:04,070 1143 00:51:04,070 --> 00:51:07,580 >> LAUREN: lujo dulce Moisés.