Recursividad
Introducción a la programación
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.
M.C. Escher, Drawing hands (1948) Paleis Lange Voorhout CC BY-SA ekenit @ Flickr
Ejemplo (en general)
“Este es un dibujo de una mano que dibuja otra mano que está dibujando una mano...”
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
Ejemplos en matemática (y computación)
Números naturalesLa 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.
Ejemplos en matemática (y computación)
Números naturalesLa 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....
¿5 es natural? No se. El sucesor de 4 es 5.
Si 4 es natural entonces 5 lo es también.
¿4 es natural? No se. El sucesor de 3 es 4.
Si 3 es natural entonces 4 lo es también. ¿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.
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)
Ejemplos en matemática (y computación)
PotenciasLa 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)
PotenciasLa 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
Para x = 3 y n = 5, o en otras palabras tres elevado a la cinco ( 35 ): 35 = 3 * 34 = 3 * ( 3 * 33 ) = 3 * (3 * ( 3 * 32 ) ) = 3 * (3 * (3 * (3 * 31) ) ) = 3 * (3 * (3 * (3 * (3 * 30 ) ) ) ) = 3 * (3 * (3 * (3 * (3 * 1 ) ) ) ) = 3 * (3 * (3 * (3 * 3 ) ) ) = 3 * (3 * (3 * 9 ) ) = 3 * (3 * 27 ) = 3 * 81 = 243
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
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”.
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
18
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.
Recursividad
Introducción a la programación
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.
M.C. Escher, Drawing hands (1948) Paleis Lange Voorhout CC BY-SA ekenit @ Flickr
Ejemplo (en general) “Este es un dibujo de
una mano que dibuja otra mano que está dibujando una mano...”
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).
Respuestas:
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
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....
¿5 es natural? No se. El sucesor de 4 es 5.
Si 4 es natural entonces 5 lo es también.
¿4 es natural? No se. El sucesor de 3 es 4.
Si 3 es natural entonces 4 lo es también. ¿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.
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).
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:
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
Para x = 3 y n = 5, o en otras palabras tres elevado a la cinco ( 35 ): 35 = 3 * 34 = 3 * ( 3 * 33 ) = 3 * (3 * ( 3 * 32 ) ) = 3 * (3 * (3 * (3 * 31) )) = 3 * (3 * (3 * (3 * (3 * 30 ) ) )) = 3 * (3 * (3 * (3 * (3 * 1) ) )) = 3 * (3 * (3 * (3 * 3 ) )) = 3 * (3 * (3 * 9 )) = 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)
●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
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 ||
¿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
pain in black - philip glass version CC BY-NC Pierre Metivier @ Flickr
http://www.flickr.com/photos/feuilllu/296739207/
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:
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
18 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.
http://creativecommons.org/licenses/by-sa/3.0/cr/http://creativecommons.org/licenses/by-sa/3.0/cr/