• No se han encontrado resultados

Recursividad. Introducción a la programación

N/A
N/A
Protected

Academic year: 2021

Share "Recursividad. Introducción a la programación"

Copied!
34
0
0

Texto completo

(1)

Recursividad

Introducción a la programación

(2)
(3)

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.

(4)

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...”

(5)

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

(6)

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.

(7)

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)

(8)

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.

(9)

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

(10)
(11)

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

(12)

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)

(13)

¿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”.

(14)
(15)

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)

(16)

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

(17)

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.

(18)

Recursividad

Introducción a la programación

(19)
(20)

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.

(21)

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

(22)

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:

(23)

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

(24)

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).

(25)

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.

(26)

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

(27)

Time spiral CC BY-SA gadl @ Flickr

(28)

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

(29)

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 ||

(30)

¿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

(31)

pain in black - philip glass version CC BY-NC Pierre Metivier @ Flickr

http://www.flickr.com/photos/feuilllu/296739207/

(32)

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:

(33)

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

(34)

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/

Referencias

Documento similar