concepto algoritmos recursivos seguimiento de la recursión · ejemplo: invertir un entero,...

33
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

Upload: vodiep

Post on 22-Oct-2018

219 views

Category:

Documents


0 download

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

«Se llama a si mismo»

«Cada vez es mas pequeño»

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

Modulo {

……

……

}

recursivo (n-1)

recursivo (n)

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

potencia(x, n) = Si (n >0) luego (x * potencia(x, n-1))

Sino (1)

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

cociente(a,b)

No recursivo

Recursivo

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

Ejemplo V: Contar la cantidad de mayúsculas de una frase.

Caso base

Caso gral.

Caso gral.

Ejemplo VI: Encontrar el mayor elemento de un vector. Caso base

Caso gral.

Caso gral.

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.

UNIDAD 7 Recursividad: Características

VENTAJAS DESVENTAJAS

* Soluciones simples * Mayor costo de tiempo de CPU

* Soluciones claras * Mayor espacio de memoria

* Soluciones elegantes * Puede producir desborde