Recursividad Introducción a la programación I semestre, 2016
Concepto general Un concepto que está definido utilizando para este propósito el propio concepto que se está definiendo. Es un proceso de repetición de operaciones similares. Resolver un problema en términos de sí mismo. La definición de recursividad es recursiva... porque debemos entender recursividad para entender recursividad.
Ejemplo (en general) Este es un dibujo de una mano que dibuja otra mano que está dibujando una mano... M.C. Escher, Drawing hands (1948) Paleis Lange Voorhout CC BY-SA ekenit @ Flickr
Concepto en matemática (y computación) La resolución de un problema recursivo usualmente consta de una serie de llamadas que deben ser resueltas antes de poder dar una solución. El comportamiento recursivo se puede apreciar cuando tenemos una definición/función en la cual se incluye: Un caso de solución básico o caso base. Una serie de operaciones/instrucciones que reducen el problema actual a resolver al caso de solución básico.
Ejemplos en matemática (y computación) Números naturales La definición de los números naturales plantea: Cero es un número natural. (Axioma) El sucesor de un número natural también es natural. Verifiquemos con el número 5...
Ejemplos en matemática (y computación) Números naturales 5 es natural? No se. El sucesor de 4 es 5. La definición de los números naturales plantea: Si 4 es natural entonces 5 lo es también. 4 es natural? No se. El sucesor de 3 es 4. Cero es un número natural. (Axioma) Si 3 es natural entonces 4 lo es también. El sucesor de un número natural también es natural. 3 es natural? No se. El sucesor de 2 es 3. Si 2 es natural entonces 3 lo es también. 2 es natural? No se. El sucesor de 1 es 2. Verifiquemos con el número 5... Si 1 es natural entonces 2 lo es también. 1 es natural? No se. El sucesor de 0 es 1. Si 0 es natural entonces 1 lo es también. 0 es natural (por axioma/baso case) Plantee un algoritmo para resolverlo
Ejemplos en matemática (y computación) Potencias La n-ésima potencia de x es: Xn = X * X (n-1) Si n = 0; entonces Xn = 1 Algoritmo: Resultado es 1, si n es igual a cero. Sino, el resultado es el producto de x y la potencia n-ésima menos uno de x. Tome algún número y verifique que cumpla con la definición.
Ejemplos en matemática (y computación) Potencias La n-ésima potencia de x es: Para x = 3 y n = 5, o en otras palabras tres elevado a la cinco ( 35 ): 35 = 3 * 34 Xn = X * X (n-1) Si n = 0; entonces Xn = 1 = 3 * ( 3 * 33 ) = 3 * (3 * ( 3 * 32 ) ) = 3 * (3 * (3 * (3 * 31) ) ) Algoritmo: = 3 * (3 * (3 * (3 * (3 * 30 ) ) ) ) Resultado es 1, si n es igual a cero. = 3 * (3 * (3 * (3 * (3 * 1 ) ) ) ) Sino, el resultado es el producto de x y la potencia n-ésima menos uno de x. = 3 * (3 * (3 * (3 * 3 ) ) ) = 3 * (3 * (3 * 9 ) ) Tome algún número y verifique que cumpla con la definición = 3 * (3 * 27 ) = 3 * 81 = 243
Time spiral CC BY-SA gadl @ Flickr
Ejercicio/Ejemplo en Python #Cuenta el número de dígitos #Entradas: un número #Salidas: el numero de dígitos o Error01 si no es un numero #Restricciones: entrada debe ser un número. def num_digitos(numero) Escriba una función en Python para resolver este problema, sin que el número sea de un tamaño específico de dígitos (anteriormente resolvimos un ejercicio similar)
Ejemplo en Python #Cuenta el número de dígitos #Entradas: un número #Salidas: el numero de dígitos o Error01 si no es un numero #Restricciones: entrada debe ser un número. def num_digitos(numero): if not isinstance(numero,int): return Error01 #'Error' else: if(numero == 0): return 0 else: return 1 + num_digitos(numero // 10)
Cómo se ejecuta esta función? >>> num_digitos(4925) 1 + num_digitos(492) # 4925 // 10 = 492 1 + 1 + num_digitos(49) # 492 // 10 = 49 1 + 1 + 1 + num_digitos(4) # 49 // 10 = 4 1 + 1 + 1 + 1 + num_digitos(0) # 4 // 10 = 0 1 + 1 + 1 + 1 + 0 # numero = 0 0 >>> 4 5 invocaciones a la misma función para resolver el problema. Este tipo de solución recursiva se conoce como de pila. Revíselo en el depurador.
pain in black - philip glass version CC BY-NC Pierre Metivier @ Flickr
Ejercicios 1. Haga una función eficiente y recursiva para multiplicar los dígitos de un número. multi_digitos(numero) >>> multi_digitos(3257) >>> multi_digitos(32057) 210 0 Al finalizar, utilizando papel y lápiz, escriba la pila de llamados para la invocación: >>> multi_digitos(3257)
Ejercicios 2. Haga una función recursiva que indique si un número tiene al menos un siete como dígito: >>> tiene_siete(486) False >>> tiene_siete(175043) True 3. Modifique el programa anterior para que reciba un parámetro adicional digito. El programa ahora va a indicar si existe digito en el numero. >>> tiene_digito(numero, digito) True or False >>> tiene_digito(3456789, 4) True >>> tiene_digito(3456789, 2) False
Las presentaciones para el curso IC-1800: "Introducción a la Programación" por Ing. En Computación Alajuela se distribuyen bajo una Licencia Creative Commons Atribución-Compartir Igual 3.0 Costa Rica. 18 http://creativecommons.org/licenses/by-sa/3.0/cr/ http://creativecommons.org/licenses/by-sa/3.0/cr/ *La licencia de la presentación no cubre las imágenes utilizadas*
Recursividad Introducción a la programación I semestre, 2016
Concepto general Un concepto que está definido utilizando para este propósito el propio concepto que se está definiendo. Es un proceso de repetición de operaciones similares. Resolver un problema en términos de sí mismo. La definición de recursividad es recursiva... porque debemos entender recursividad para entender recursividad.
Ejemplo (en general) Este es un dibujo de una mano que dibuja otra mano que está dibujando una mano... M.C. Escher, Drawing hands (1948) Paleis Lange Voorhout CC BY-SA ekenit @ Flickr Este es un ejemplo de recursividad en el Arte, utilizando el concepto general: la explicación del dibujo nos lleva otra vez a la misma explicación que estamos haciendo. Escuchar guitarra y vos del disco Eco2. Que viva la ciencia que viva la poesía... Es cierto que no hay arte sin emoción, Y que no hay precisión sin artesania... Hay fórmulas hasta para describir la espiral de una caracola... hay manos capaces de fabricar herramientas con las que se hacen máquinas para hacer
Concepto en matemática (y computación) La resolución de un problema recursivo usualmente consta de una serie de llamadas que deben ser resueltas antes de poder dar una solución. El comportamiento recursivo se puede apreciar cuando tenemos una definición/función en la cual se incluye: Un caso de solución básico o caso base. Una serie de operaciones/instrucciones que reducen el problema actual a resolver al caso de solución básico. Ejemplo (intento de metáfora con la vida real): Vamos a hacer un viaje en bus desde la SIU hasta San Pedro de Montes de Oca. Problema: SIU San pedro (chepe) 1. Si estamos en San Pedro ya llegamos, sino buscar un bus que nos acerque. 2. tomar un bus: *a. Siu Alajuela: Problema ahora Alajuela San pedro. *b. Alajuela San José: Problema ahora San José san pedro. *c- San josé San pedro: Problema ahora San Pedro San pedro (caso 1).
Ejemplos en matemática (y computación) Números naturales La definición de los números naturales plantea: Cero es un número natural. (Axioma) El sucesor de un número natural también es natural. Verifiquemos con el número 5... Sucesor es el número que sigue o sea, sucesor(x) = x + 1
Ejemplos en matemática (y computación) Números naturales 5 es natural? No se. El sucesor de 4 es 5. La definición de los números naturales plantea: Si 4 es natural entonces 5 lo es también. 4 es natural? No se. El sucesor de 3 es 4. Cero es un número natural. (Axioma) Si 3 es natural entonces 4 lo es también. El sucesor de un número natural también es natural. 3 es natural? No se. El sucesor de 2 es 3. Si 2 es natural entonces 3 lo es también. 2 es natural? No se. El sucesor de 1 es 2. Verifiquemos con el número 5... Si 1 es natural entonces 2 lo es también. 1 es natural? No se. El sucesor de 0 es 1. Si 0 es natural entonces 1 lo es también. 0 es natural (por axioma/baso case) Plantee un algoritmo para resolverlo Se puede utilizar lógica inversa. Pasar esto a algoritmo no es complicado, si lo pensamos para python entonces lo mejor será hacerlo a la inversa... Dado un número: - si es cero es natural, - es natural si el anterior es natural[ anterior(x) = x-1 ] (ver apuntes: clase10 semana05). Ver código:
Ejemplos en matemática (y computación) Potencias La n-ésima potencia de x es: Xn = X * X (n-1) Si n = 0; entonces Xn = 1 Algoritmo: Resultado es 1, si n es igual a cero. Sino, el resultado es el producto de x y la potencia n-ésima menos uno de x. Tome algún número y verifique que cumpla con la definición.
Ejemplos en matemática (y computación) Potencias La n-ésima potencia de x es: Para x = 3 y n = 5, o en otras palabras tres elevado a la cinco ( 35 ): 35 = 3 * 34 Xn = X * X (n-1) Si n = 0; entonces Xn = 1 = 3 * ( 3 * 33 ) = 3 * (3 * ( 3 * 32 ) ) = 3 * (3 * (3 * (3 * 31) ) ) Algoritmo: = 3 * (3 * (3 * (3 * (3 * 30 ) ) ) ) Resultado es 1, si n es igual a cero. = 3 * (3 * (3 * (3 * (3 * 1 ) ) ) ) Sino, el resultado es el producto de x y la potencia n-ésima menos uno de x. = 3 * (3 * (3 * (3 * 3 ) ) ) = 3 * (3 * (3 * 9 ) ) Tome algún número y verifique que cumpla con la definición = 3 * (3 * 27 ) = 3 * 81 = 243
Time spiral CC BY-SA gadl @ Flickr Habrá que invertir tiempo en solucionar esto.
Ejercicio/Ejemplo en Python #Cuenta el número de dígitos #Entradas: un número #Salidas: el numero de dígitos o Error01 si no es un numero #Restricciones: entrada debe ser un número. def num_digitos(numero) Escriba una función en Python para resolver este problema, sin que el número sea de un tamaño específico de dígitos (anteriormente resolvimos un ejercicio similar) Problema: hacer un programa que cuente la cantidad de dígitos de un número. num_digitos(123) 3 num_digitos(123456) 6 Recordar que para hacer un número más pequeño usamos la división entera y para sacar el valor del dígito menos significativo una operación de residuo o
Ejemplo en Python #Cuenta el número de dígitos #Entradas: un número #Salidas: el numero de dígitos o Error01 si no es un numero #Restricciones: entrada debe ser un número. def num_digitos(numero): if not isinstance(numero,int): return Error01 #'Error' else: if(numero == 0): return 0 else: return 1 + num_digitos(numero // 10) Problema: hacer un programa que cuente la cantidad de dígitos de un número. num_digitos(123) 3 num_digitos(123456) 6
Cómo se ejecuta esta función? >>> num_digitos(4925) 1 + num_digitos(492) # 4925 // 10 = 492 1 + 1 + num_digitos(49) # 492 // 10 = 49 1 + 1 + 1 + num_digitos(4) # 49 // 10 = 4 1 + 1 + 1 + 1 + num_digitos(0) # 4 // 10 = 0 1 + 1 + 1 + 1 + 0 # numero = 0 0 >>> 4 5 invocaciones a la misma función para resolver el problema. Este tipo de solución recursiva se conoce como de pila. Revíselo en el depurador. Asegurarme que todos lo corran en el debugger Revíselo en el depurador.
pain in black - philip glass version CC BY-NC Pierre Metivier @ Flickr http://www.flickr.com/photos/feuilllu/296739207/ Hasta acá la clase 10.
Ejercicios 1. Haga una función eficiente y recursiva para multiplicar los dígitos de un número. multi_digitos(numero) >>> multi_digitos(3257) 210 >>> multi_digitos(32057) 0 Al finalizar, utilizando papel y lápiz, escriba la pila de llamados para la invocación: >>> multi_digitos(3257)
Ejercicios 2. Haga una función recursiva que indique si un número tiene al menos un siete como dígito: >>> tiene_siete(486) False >>> tiene_siete(175043) True 3. Modifique el programa anterior para que reciba un parámetro adicional digito. El programa ahora va a indicar si existe digito en el numero. >>> tiene_digito(numero, digito) True or False >>> tiene_digito(3456789, 4) True >>> tiene_digito(3456789, 2) False
Las presentaciones para el curso IC-1800: "Introducción a la Programación" por Ing. En Computación Alajuela se distribuyen bajo una Licencia Creative Commons Atribución-Compartir Igual 3.0 Costa Rica. 18 http://creativecommons.org/licenses/by-sa/3.0/cr/ http://creativecommons.org/licenses/by-sa/3.0/cr/ *La licencia de la presentación no cubre las imágenes utilizadas*