Lo que quiero hacer en este video es aclarar
la diferencia entre
una definición de función irativa, o debería decir iterativa,
siempre lo pronuncio mal,
definición de función iterativa,
y una definición de función recursiva.
Lo haremos realmente por...como que entendamos donde está sucediendo la iteración aquí
y donde está sucendiendo la recursión aquí a la derecha.
Entonces cuando comenzamos vemos que 'product' lo hacemos igual a 1
y entonces entramos nuestro ciclo 'for' y el ciclo 'for' es realmente el meollo de la definición de la función iterativa.
Y entiendiendo lo que está pasando en el ciclo 'for'. Hagamos, hagamos una tablita aqui.
Así que voy a hacer una tabla para el valor de nuestra variable i y también voy a descifrar el
valor de 'product' multiplicado por i + 1,
porque en cada iteración en este ciclo 'for' vamos a evaluar este asunto justo aquí
y luego voy a hacer una columna para el nuevo valor de nuestro 'product', el nuevo valor de nuestro 'product'.
Subrayemos estas cosas y luego tenemos el nuevo valor de nuestro 'product'.
Así que aprendimos en muchos videos anteriores que en Python decimos 'for i in range'.
Este 'range' de aquí,...
Este 'range' de aquí regresa una lista y regresa una lista del número de elementos,
como el número que hemos pasado... Lo pasamos aqui.
Si asumimos y debería de haber dicho desde el principio.
Asumamos que estamos llamando sólo para hacer algo específico.
Digamos, este es el resultado de llamar el factorial de 3.
Entonces el argumento que pasamos a este factorial es 3. La variable 'number' se referirá a 3.
Cuando llamas 'range' de 'number', literalmente regresará una lista: 0, 1, 2.
Entonces 3 elementos comenzando con 0, el último elemento es 3 - 1. Es 2.
Y entonces cada ciclo a través de este ciclo 'for' se le va a asignar i a cada elemento sucesivo
en la lista.
Entonces la primera vez a través de este ciclo 'for' se le va a asignar a i un 0.
Nuestro i se va a referir al 0.
Y entonces 'product' por i - 1, bueno en este primer ciclo, 'product' apareció antes de que
si quiera entrara en el ciclo, 'product' se definió como 1.
Entonces 'product' va a ser 1 y esto es 1 por --No quiero hacerlo en ese color, sólo lo haré
en magenta...Lo haré en magenta--1 por i, que es 0. 1 por 0 + 1.
Más 1 y esto...y entonces nuestro nuevo valor de 'product' es esencialmente esto evaluado.
Lo tenemos bien aquí.
'Product' es igual a todo este asunto.
Nuestro nuevo valor es 1 por 0 más 1 y eso es exactamente 1 * 1 y eso va a ser 1.
Eso es todo lo que teníamos dentro del ciclo 'for',
porque esa fue la única cosa que intentábamos dentro del ciclo 'for'
y entonces vamos a regresar y vamos a iterar a través de la siguiente iteración de nuestro ciclo.
Me supongo que podrías decir 'Y ahora i va a tener un 1 asignado.'
Entonces ahora i va a ser 1.
Esta expresión de aquí, vamos a tomar nuestro 'product' anterior.
Entonces 'product' es aún 1. Por lo tanto 'product' es 1 y va a ser multiplicado por i, que ahora es 1 + 1.
Y a qué va a ser igual esto?
Bueno si evalúas todo esto, obtienes 1 * 2. Entonces ahore el nuevo valor de 'product' es 2.
Después de nuestra segunda iteración a través de nuestro ciclo, nuestra segunda pasada a través del ciclo.
Ahora regresaremos al comienzo del ciclo y a i se le asignará el siguiente elemento
de la lista. Se le asignará ahora un 2.
Ahora i es 2. Esta cosa de aquí, vamos a tomar...
Esto va a ser 'product'. 'Product' ahora es 2.
Entonces va a ser 2 por i, bueno i es ahora 2 + 1 y entonces qué es esto? Es 2 por 3 o sea 6.
O 6 y entonces se va y diremos OK, podemos asignar i a algún elemento adicional en esto?
No, se nos han acabado los elementos. Salimos del ciclo 'for' y regresamos el producto.
O la variable 'product', a lo que se esta refireindo y eso es lo que debería decir.
Deberíamos regresar el valor al que 'product' se está refiriendo y ese valor es 6.
Entonces cuando llamas 'factorial 3', regresará 6.
Entonces si fueras a decir 'factorial', si dices factorial de 3 más factorial de 3
y si fueras a evaluar esta expresión, esta expresión evaluaría en 6.
Y esta expresión de aquí evaluaría en 6 porque eso es lo que la función regresaría.
Y entonces si añades esos, evaluaría en 12.
Así que esto es por lo que lo llamamos iterativo.
Seguimos iterando a través del mismo conjunto de instrucciones y ahora comparemos la definición recursiva.
Y ésta es un poco más divertida en muchas formas.
Una vez de nuevo vamos a llamar factorial de 3.
Factorial de 3.
Entonces 3 es nuestro argumento. Ese es el valor al que ese número hará referencia y lo tomará.
Y dice, si 'number' es menor que o igual a 1.
Bueno 3 no es menor que o igual a 1.
Entonces no vamos a hacer esta parte de aquí.
Vamos a hacer la cláusula 'else'.
Entonces vamos a regresar 'number'. Vamos a regresar 'number' por factorial de todo esto.
Entonces esto va a evaluar en 'number' que es 3. Ese es el argumento que pasamos.
Multiplicado por factorial de 'number' menos 1.
Bueno 'number' - 1 va a evaluar en 2. Tres menos 1 es 2.
Entonces por factorial de 2.
Bueno eso es otra función llamada 'factorial' entonces regresamos.
Bueno, factorial, pero ahora el argumento es 2. Entonces el 'number' es 2.
Vamos aquí. Si 'number' es menor que o igual a 1, hacemos esto.
Pero 'number' no es menor que o igual a 1. Es 2. Entonces ahora hacemos 'else'.
Entonces lo que ahora queremos regresar es 'number' por factorial 'number' menos 1.
Bueno, en esta situación...
En esta situación, 'number' es ahora 2 y vamos a querer multiplicar esas veces el factorial...
por el factorial de 2 - 1.
Bueno 2 - 1 es 1.
Por el factorial de 1.
Bueno, exactamente hemos hecho otra llamada a la función. Entonces el interpretador como que tiene que recordar que hicimos toda esta
serie de llamadas a la función y tiene que seguir excavando más profundo y más profundo y más profundo.
Ahora hemos llamado factorial de 1.
Factorial de 1. Cuál es el argumento? 'Number' se refiere a 1.
Si 'number' es menos que o igual a 1,
'number' es menor que o igual a 1.
Ahora esto es lo que llamamos un caso base. Como que estamos bajando hacia él.
Entonces 'number' es menor que o igual a 1. Regresa 1.
Entonces en esta situación, cuando llamamos factorial 1, literalmente regresa 1.
Y ahora sabemos que factorial de 2 evalúa en 2 por 1.
Entonces esto evalúa en 2 y ahora sabemos que factorial de 3 evalúa en 3 por 2, lo que evaluará en 6.
Así que hay diferentes formas de pensar en esto, pero que dan exactamente el mismo resultado.
Una vez de nuevo, si tienes factorial de 3 + factorial de 3, no importa como lo implementamos,
obtendremos 6 + 6 o 12.