0:00:00.667,0:00:02.733 Lo que quiero hacer en este video es aclarar 0:00:02.733,0:00:04.200 la diferencia entre 0:00:04.200,0:00:07.200 una definición de función irativa, o debería decir iterativa, 0:00:07.200,0:00:08.400 siempre lo pronuncio mal, 0:00:08.400,0:00:10.800 definición de función iterativa, 0:00:10.800,0:00:15.667 y una definición de función recursiva. 0:00:15.667,0:00:21.267 Lo haremos realmente por...como que entendamos [br]donde está sucediendo la iteración aquí 0:00:21.267,0:00:24.133 y donde está sucendiendo la recursión aquí[br]a la derecha. 0:00:24.133,0:00:28.333 Entonces cuando comenzamos vemos que 'product'[br]lo hacemos igual a 1 0:00:28.333,0:00:36.533 y entonces entramos nuestro ciclo 'for' y el ciclo[br]'for' es realmente el meollo de la definición de[br]la función iterativa. 0:00:36.533,0:00:40.333 Y entiendiendo lo que está pasando en el ciclo[br]'for'. Hagamos, hagamos una tablita aqui. 0:00:40.333,0:00:49.641 Así que voy a hacer una tabla para el valor[br]de nuestra variable i y también voy a descifrar el 0:00:49.641,0:00:54.200 valor de 'product' multiplicado por i + 1, 0:00:54.200,0:00:59.400 porque en cada iteración en este ciclo 'for' vamos a[br]evaluar este asunto justo aquí 0:00:59.400,0:01:07.133 y luego voy a hacer una columna para el nuevo valor [br]de nuestro 'product', el nuevo valor de nuestro 'product'. 0:01:07.133,0:01:11.800 Subrayemos estas cosas y luego tenemos[br]el nuevo valor de nuestro 'product'. 0:01:11.800,0:01:17.733 Así que aprendimos en muchos videos anteriores[br]que en Python decimos 'for i in range'. 0:01:17.733,0:01:20.067 Este 'range' de aquí,... 0:01:20.067,0:01:26.400 Este 'range' de aquí regresa una lista y regresa[br]una lista del número de elementos, 0:01:26.400,0:01:29.733 como el número que hemos pasado...[br]Lo pasamos aqui. 0:01:29.733,0:01:32.333 Si asumimos y debería de haber dicho desde[br]el principio. 0:01:32.333,0:01:35.800 Asumamos que estamos llamando sólo para[br]hacer algo específico. 0:01:35.800,0:01:45.333 Digamos, este es el resultado de llamar el factorial de 3. 0:01:45.333,0:01:51.933 Entonces el argumento que pasamos a este factorial[br]es 3. La variable 'number' se referirá a 3. 0:01:51.933,0:01:58.800 Cuando llamas 'range' de 'number', literalmente[br]regresará una lista: 0, 1, 2. 0:01:58.800,0:02:03.733 Entonces 3 elementos comenzando con 0, el[br]último elemento es 3 - 1. Es 2. 0:02:03.733,0:02:09.600 Y entonces cada ciclo a través de este ciclo 'for' [br]se le va a asignar i a cada elemento sucesivo 0:02:09.600,0:02:10.667 en la lista. 0:02:10.667,0:02:14.933 Entonces la primera vez a través de este ciclo 'for'[br]se le va a asignar a i un 0. 0:02:14.933,0:02:18.133 Nuestro i se va a referir al 0. 0:02:18.133,0:02:25.800 Y entonces 'product' por i - 1, bueno en[br]este primer ciclo, 'product' apareció antes de que 0:02:25.800,0:02:28.400 si quiera entrara en el ciclo, 'product' se[br]definió como 1. 0:02:28.400,0:02:36.667 Entonces 'product' va a ser 1 y esto es 1 [br]por --No quiero hacerlo en ese color, sólo lo haré 0:02:36.667,0:02:47.667 en magenta...Lo haré en magenta--1 por[br]i, que es 0. 1 por 0 + 1. 0:02:47.667,0:02:53.533 Más 1 y esto...y entonces nuestro nuevo valor de[br]'product' es esencialmente esto evaluado. 0:02:53.533,0:02:54.667 Lo tenemos bien aquí. 0:02:54.667,0:02:56.667 'Product' es igual a todo este asunto. 0:02:56.667,0:03:01.933 Nuestro nuevo valor es 1 por 0 más 1[br]y eso es exactamente 1 * 1 y eso va a ser 1. 0:03:01.933,0:03:05.467 Eso es todo lo que teníamos dentro del ciclo 'for', 0:03:05.467,0:03:08.533 porque esa fue la única cosa que intentábamos[br]dentro del ciclo 'for' 0:03:08.533,0:03:16.467 y entonces vamos a regresar y vamos a[br]iterar a través de la siguiente iteración de[br]nuestro ciclo. 0:03:16.467,0:03:19.667 Me supongo que podrías decir 'Y ahora i va a [br]tener un 1 asignado.' 0:03:19.667,0:03:22.667 Entonces ahora i va a ser 1. 0:03:22.667,0:03:25.800 Esta expresión de aquí, vamos a tomar nuestro[br]'product' anterior. 0:03:25.800,0:03:40.329 Entonces 'product' es aún 1. Por lo tanto 'product'[br]es 1 y va a ser multiplicado por i, que ahora es 1 + 1. 0:03:40.329,0:03:42.267 Y a qué va a ser igual esto? 0:03:42.267,0:03:48.333 Bueno si evalúas todo esto, obtienes 1 * 2.[br]Entonces ahore el nuevo valor de 'product' es 2. 0:03:48.333,0:03:52.867 Después de nuestra segunda iteración a través[br]de nuestro ciclo, nuestra segunda pasada a[br]través del ciclo. 0:03:52.867,0:04:00.267 Ahora regresaremos al comienzo del ciclo[br]y a i se le asignará el siguiente elemento 0:04:00.267,0:04:02.600 de la lista. Se le asignará ahora un 2. 0:04:02.600,0:04:06.333 Ahora i es 2. Esta cosa de aquí, vamos a tomar... 0:04:06.333,0:04:08.933 Esto va a ser 'product'. 'Product' ahora es 2. 0:04:08.933,0:04:23.600 Entonces va a ser 2 por i, bueno i es ahora 2 + 1[br]y entonces qué es esto? Es 2 por 3 o sea 6. 0:04:23.600,0:04:30.092 O 6 y entonces se va y diremos OK, podemos[br]asignar i a algún elemento adicional en esto? 0:04:30.092,0:04:36.785 No, se nos han acabado los elementos. Salimos[br]del ciclo 'for' y regresamos el producto. 0:04:36.785,0:04:41.800 O la variable 'product', a lo que se esta refireindo y[br]eso es lo que debería decir. 0:04:41.800,0:04:46.600 Deberíamos regresar el valor al que 'product'[br]se está refiriendo y ese valor es 6. 0:04:46.600,0:04:50.067 Entonces cuando llamas 'factorial 3', regresará 6. 0:04:50.067,0:04:59.821 Entonces si fueras a decir 'factorial', si dices factorial de[br]3 más factorial de 3 0:04:59.821,0:05:05.600 y si fueras a evaluar esta expresión, esta expresión[br]evaluaría en 6. 0:05:05.600,0:05:10.098 Y esta expresión de aquí evaluaría en 6[br]porque eso es lo que la función regresaría. 0:05:10.098,0:05:13.867 Y entonces si añades esos, evaluaría en 12. 0:05:13.867,0:05:16.067 Así que esto es por lo que lo llamamos iterativo. 0:05:16.067,0:05:22.467 Seguimos iterando a través del mismo conjunto[br]de instrucciones y ahora comparemos la[br]definición recursiva. 0:05:22.467,0:05:24.867 Y ésta es un poco más divertida en muchas formas. 0:05:24.867,0:05:27.800 Una vez de nuevo vamos a llamar factorial de 3. 0:05:27.800,0:05:30.600 Factorial de 3. 0:05:30.600,0:05:34.600 Entonces 3 es nuestro argumento. Ese es el valor al[br]que ese número hará referencia y lo tomará. 0:05:34.600,0:05:36.933 Y dice, si 'number' es menor que o igual a 1. 0:05:36.933,0:05:38.800 Bueno 3 no es menor que o igual a 1. 0:05:38.800,0:05:40.667 Entonces no vamos a hacer esta parte de aquí. 0:05:40.667,0:05:41.867 Vamos a hacer la cláusula 'else'. 0:05:41.867,0:05:48.933 Entonces vamos a regresar 'number'. Vamos a[br]regresar 'number' por factorial de todo esto. 0:05:48.933,0:05:57.200 Entonces esto va a evaluar en 'number' que es 3.[br]Ese es el argumento que pasamos. 0:05:57.200,0:06:07.867 Multiplicado por factorial de 'number' menos 1. 0:06:07.867,0:06:11.200 Bueno 'number' - 1 va a evaluar en 2. Tres menos 1 es 2. 0:06:11.200,0:06:13.102 Entonces por factorial de 2. 0:06:13.118,0:06:15.800 Bueno eso es otra función llamada 'factorial'[br]entonces regresamos. 0:06:15.800,0:06:19.133 Bueno, factorial, pero ahora el argumento es 2.[br]Entonces el 'number' es 2. 0:06:19.133,0:06:21.800 Vamos aquí. Si 'number' es menor que o igual a 1,[br]hacemos esto. 0:06:21.800,0:06:24.867 Pero 'number' no es menor que o igual a 1. Es 2.[br]Entonces ahora hacemos 'else'. 0:06:24.867,0:06:30.333 Entonces lo que ahora queremos regresar es[br]'number' por factorial 'number' menos 1. 0:06:30.333,0:06:31.600 Bueno, en esta situación... 0:06:31.600,0:06:38.000 En esta situación, 'number' es ahora 2 y vamos[br]a querer multiplicar esas veces el factorial... 0:06:38.000,0:06:43.933 por el factorial de 2 - 1. 0:06:43.933,0:06:45.467 Bueno 2 - 1 es 1. 0:06:45.467,0:06:47.400 Por el factorial de 1. 0:06:47.400,0:06:52.533 Bueno, exactamente hemos hecho otra llamada[br]a la función. Entonces el interpretador como que[br]tiene que recordar que hicimos toda esta 0:06:52.533,0:06:55.467 serie de llamadas a la función y tiene que[br]seguir excavando más profundo y más[br]profundo y más profundo. 0:06:55.467,0:06:57.800 Ahora hemos llamado factorial de 1. 0:06:57.800,0:07:02.200 Factorial de 1. Cuál es el argumento? 'Number' se[br]refiere a 1. 0:07:02.200,0:07:04.067 Si 'number' es menos que o igual a 1, 0:07:04.067,0:07:05.800 'number' es menor que o igual a 1. 0:07:05.800,0:07:08.595 Ahora esto es lo que llamamos un caso base.[br]Como que estamos bajando hacia él. 0:07:08.595,0:07:11.733 Entonces 'number' es menor que o igual a 1. Regresa 1. 0:07:11.733,0:07:16.733 Entonces en esta situación, cuando llamamos[br]factorial 1, literalmente regresa 1. 0:07:16.733,0:07:23.333 Y ahora sabemos que factorial de 2 evalúa en[br]2 por 1. 0:07:23.333,0:07:36.200 Entonces esto evalúa en 2 y ahora sabemos que[br]factorial de 3 evalúa en 3 por 2, lo que evaluará en 6. 0:07:36.200,0:07:39.800 Así que hay diferentes formas de pensar en esto,[br]pero que dan exactamente el mismo resultado. 0:07:39.800,0:07:44.267 Una vez de nuevo, si tienes factorial de 3 + [br]factorial de 3, no importa como lo implementamos, 0:07:44.267,9:59:59.000 obtendremos 6 + 6 o 12.