concepto algoritmos recursivos seguimiento de la recursión · ejemplo: invertir un entero,...
TRANSCRIPT
UNIDAD 7 Recursividad
Concepto. Algoritmos recursivos. Seguimiento de la recursión. Algunos métodos recursivos de búsqueda y ordenación: M-Sort y Q-Sort. Comparación de eficiencia en métodos Iterativos vs recursivos
UNIDAD 7 Recursividad: Concepto
Recursión:
Un elemento es recursivo cuando en su definición se utiliza nuevamente a ese elemento
UNIDAD 7 Recursividad: Concepto
Técnica de programación que permite que
un módulo se invoque a sí mismo, con una
versión mas pequeña del problema original
en cada nueva invocación.
Iteración
Debe tener un fin!
UNIDAD 7 Recursividad: Concepto
• NO es una estructura de datos.
LA RECURSION
• NO es un tipo de variable.
UNIDAD 7 Tipos de Recursividad
* Directa: Proceso por el cual un modulo se llama a si mismo desde el propio cuerpo del modulo.
* Indirecta: Implica mas de un modulo, que se llaman unos a otros formando un ciclo.
Clasificación 1
UNIDAD 7 Tipos de Recursividad
Clasificación 2
* Lineal: El modulo se invoca a si mismo una única vez.
* Múltiple: El modulo se invoca a si mismo mas de una vez dentro de una misma activación.
UNIDAD 7 Recursividad: Ejemplo I
Matemáticamente:
Pseudocódigo:
factorial(n)= Si (n=0) luego 1
Sino n* factorial(n-1)
!
UNIDAD 7 Recursividad: Ejemplo I
Se
calcula
reiterada
mente el
factorial
de un
numero
Se regre
san los
resultados
Ejemplo: Calcular el factorial de 7.
No requiere nuevo calculo Retroseguimiento
UNIDAD 7 Recursividad: Ejemplo I no recursivo
Ejemplo: Calcular el factorial de 7.
Usando iteraciones
UNIDAD 7 Partes de una función recursiva
factorial(n)= Si (n=0) luego 1
Sino n* factorial (n-1)!
Caso base
Caso general
Ejemplo: Calcular el factorial de 7.
UNIDAD 7 Partes de una función recursiva
* CASO BASE: Situación que produce un resultado inmediato, es decir, permite detener las llamadas recursivas.
* CASO GENERAL: Cuando la función se invoca a si misma.
Pueden haber uno o mas casos bases en un modulo
para realizar un calculo mas pequeño!
UNIDAD 7 Recursividad: Metodología de desarrollo
* Buscar la salida de la recursión: Buscar casos en los que se puede dar respuesta inmediata al problema planteado.
* Determinar los avances de la recursión: Buscar casos en los que se puede plantear la respuesta en términos de una llamada recursiva.
* Escribir un algoritmo que implemente el planteamiento logrado.
UNIDAD 7 Recursividad: Metodología de desarrollo
Claves:
1) Identificar caso base
2) Identificar caso general
3) Si está pensando en una versión no recursiva,
cambie los ciclos: For o While por If
UNIDAD 7 Recursividad: ejemplo I recursivo
Ejemplo: Calcular el factorial de 7.
Caso base:
La función
no recurre Caso general o
recursivo: con
parámetros más
pequeños
17
Ejemplo II: Queremos calcular x n , x 0 y n 0
x n =
1 Si n = 0
x * x (n-1) Si n > 0
En pseudocódigo:
Ej: 2 4 = 2 * 2 3
2 3 = 2 * 2 2
2 2 = 2 * 2 1
2 1= 2 * 2 0
2 0= 1
= 2 * 1 = 2
= 2 * 2 = 4
= 2 * 4 = 8
= 2 * 8 = 16 Resultado
La definición de potencia en notación matemática es:
potencia(x, n) = Si (n >0) luego (x * potencia(x,n-1) )
Sino (1)
18
potencia(x, n) = Si (n >0) luego (x * potencia(x, n-1))
Sino (1)
Potencia(2, 4) = (2 * potencia(2, 3))
Potencia(2, 3) = (2 * potencia(2, 2))
Potencia(2, 2) = (2 * potencia(2, 1))
Potencia(2, 1) = (2 * potencia(2, 0))
Potencia(2, 0) = 1
2 * 1 = 2
2 * 2 = 4
2 * 4 = 8
2 * 8 = 16
Retorna 16
Caso base:
La función
no recurre
Caso general o
recursivo: con
parámetros más
pequeños
Ejemplo III: cociente(a, b)
20
Algoritmo: - Versión iterativa
cociente(a, b) =
c := 0; // contador
Mientras (a b) Hacer
a := a - b;
c := c + 1;
Fin_Mientras
contestar(c)
Algoritmo: - Versión recursiva
cociente(a, b) =
Si (a b) luego
contestar( 1 + cociente(a-b, b) )
sino contestar (0)
Caso base: no se puede restar
b de a
Caso general: argumento más
pequeño
Casos de prueba: Caso 1: a = 3, b= 4; Caso 2: a = 15, b = 4
Realizar la traza de ejecución:
cociente(3,4) = contestar (0) Retorna 0 ; cociente(3,4) = 0
cociente(15,4) = contestar (1 + cociente(15 - 4, 4))
cociente(11,4) = contestar (1 + cociente(11-4, 4))
Retorna 3
cociente(7, 4) = contestar (1 + cociente(7-4, 4))
cociente(3, 4) = contestar (0)
0
1
2
cociente(a, b) = Si (a b) luego
contestar( 1 + cociente(a-b, b) )
sino contestar (0)
cociente(15,4) = 3
Caso 1: a = 3, b= 4
Caso 2: a = 15, b= 4
1 + 0 = 1
1 + 1 = 2
1 + 2 = 3
Ejemplo IV: Búsqueda Secuencial
Dado un vector v de n números, realizar la búsqueda de un elemento t.
Buscar un elemento que esté en el vector:
Ejemplo: si v=[12,25,7,19,23] , n = 5, t =7 la salida será Verdadero
12 25 7 19 23 v t = 7
i=1
¿ t = v[i] ? ¿ 7 = v[1]= 12 => => NO
12 25 7 19 23 v
i=2
¿ t = v[i] ? ¿ 7 = v[2]= 25 => => NO Incrementar i
12 25 7 19 23 v
i=3
¿ t = v[i] ? ¿ 7 = v[3]= 7 => SI Verdadero
Incrementar i
Ejemplo IV: Búsqueda Secuencial
Buscar un elemento que NO esté en el vector:
Ejemplo: si v=[12,25,7,19,23] , n = 5, t =1 la salida será Falso
12 25 7 19 23 v
i=1
¿ t = v[i] ? ¿ 1 = v[1]= 12 => => NO,
Incrementar i
12 25 7 19 23 v
i=2
¿ t = v[i] ? ¿ 1 = v[2]= 25 => => NO,
Incrementar i
12 25 7 19 23 v
i=3
¿ t = v[i] ? ¿ 1 = v[3]= 7 => No,
Incrementar i
12 25 7 19 23 v
i=4
¿ t = v[i] ? ¿ 1 = v[4]=19 => No,
Incrementar i
12 25 7 19 23 v
i=5
¿ t = v[i] ? ¿ 1 = v[5]=23 => No,
Incrementar i i = 6 > n => Falso
Ejemplo IV: Búsqueda Secuencial
25
Expresar el problema mediante un modelo, para ello debemos Identificar:
Caso base: 1. NO Encontrado
2. Encontrado
i > n
v[i] = t
Si (i n) y t v[i] entonces buscar(v, i+1, n) Caso general o recursivo:
buscar(v, n, t) =
Si (n=0) luego contestar(“V Vacío”)
Sino buscar1(v, 1, n, t)
donde
buscar1(v, i, n, t) =
Si (i n) luego
Si (v[i] = t) luego contestar (Verdadero)
Sino buscar1(v, i+1, n, t)
Sino contestar(Falso)
Caso
General
Caso
Base
Obtener un algoritmo:
- Versión recursiva
Ejemplo IV: Búsqueda Secuencial
26
Diseñar casos de prueba:
Caso1: t = 7 (Verdadero) , Caso 2: t =1 (Falso)
Realizar la traza de ejecución: Caso 1 ( t = 7)
buscar([12, 25, 7, 19, 23], 5, 7) = buscar1([12, 25, 7, 19, 23], 1, 5, 7)
buscar1([12, 25, 7, 19, 23], 1, 5, 7) // i= 1; i 5; 12 7 =>
buscar1([12, 25, 7, 19, 23], 2, 5, 7) // i= 2; i 5; 25 7 =>
buscar1([12, 25, 7, 19, 23], 3, 5, 7) = // i= 3; i 5; 7 = 7 => Verdadero
buscar(v, n, t) =
Si (n=0) luego contestar(“V Vacío”)
Sino buscar1(v, 1, n, t)
donde
buscar1(v, i, n, t) =
Si (i n) luego
Si (v[i] = t) luego contestar (Verdadero)
Sino buscar1(v, i+1, n, t)
Sino contestar(Falso)
Ejemplo IV: Búsqueda Secuencial
27
Realizar la traza de ejecución: Caso 2 ( t = 1)
buscar([12, 25, 7, 19, 23], 5, 1) = buscar1([12, 25, 7, 19, 23], 1, 5, 1)
buscar1([12, 25, 7, 19, 23], 1, 5, 1) = // i= 1; i 5; 12 1 =>
buscar1([12, 25, 7, 19, 23], 2, 5, 1)= // i= 2; i 5; 25 1 =>
buscar1([12, 25, 7, 19, 23], 3, 5, 1) = // i= 3; i 5; 7 1 =>
buscar1([12, 25, 7, 19, 23], 4, 5, 1) = // i= 4; i 5; 19 1 =>
buscar1([12, 25, 7, 19, 23], 5, 5, 1) = // i= 5; i 5; 23 1 =>
buscar1([12, 25, 7, 19, 23], 6, 5, 1) = // i= 6; i > n => Falso
buscar(v, n, t) =
Si (n=0) luego contestar(“V Vacío”)
Sino buscar1(v, 1, n, t)
donde
buscar1(v, i, n, t) =
Si (i n) luego
Si (v[i] = t) luego contestar (Verdadero)
Sino buscar1(v, i+1, n, t)
Sino contestar(Falso)
Tarea: Codificar
en C
UNIDAD 7 Iteración vs. Recursión
Característica ITERACION RECURSION
Repetición
La consigue mediante el uso de estructuras repetitivas.
La consigue mediante invocaciones sucesivas al mismo modulo.
Prueba de terminación
Cuando la condición de continuación del ciclo es falsa.
Cuando se llega al caso base.
Criterios: Cuándo usar recursión ?
31
• Cuando el dato está definido recursivamente:
Ejemplo: las listas o vectores, árboles.
• Cuando el algoritmo sea repetitivo y trata valores cada vez más
pequeños:
Ejemplo: invertir un entero, cantidad de dígitos de un número.
• Cuando obtener una solución iterativa sea mucho más complicado que
una solución recursiva.
Ejemplo: búsqueda secuencial
Criterios: Cuándo No usar recursión ?
32
• Cuando el lenguaje de programación no lo permita:
Ejemplo: Fortran, Cobol
• Cuando la solución iterativa sea clara a simple vista.
• Cuando el tamaño de los argumentos sea muy grande.