Top Banner
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
33

Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

Oct 22, 2018

Download

Documents

vodiep
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 2: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

UNIDAD 7 Recursividad: Concepto

Recursión:

Un elemento es recursivo cuando en su definición se utiliza nuevamente a ese elemento

Page 3: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

UNIDAD 7 Recursividad: Concepto

«Se llama a si mismo»

«Cada vez es mas pequeño»

Page 4: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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!

Page 5: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

UNIDAD 7 Recursividad: Concepto

Modulo {

……

……

}

recursivo (n-1)

recursivo (n)

Page 6: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

UNIDAD 7 Recursividad: Concepto

• NO es una estructura de datos.

LA RECURSION

• NO es un tipo de variable.

Page 7: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 8: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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.

Page 9: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

UNIDAD 7 Recursividad: Ejemplo I

Matemáticamente:

Pseudocódigo:

factorial(n)= Si (n=0) luego 1

Sino n* factorial(n-1)

!

Page 10: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 11: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

UNIDAD 7 Recursividad: Ejemplo I no recursivo

Ejemplo: Calcular el factorial de 7.

Usando iteraciones

Page 12: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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.

Page 13: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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!

Page 14: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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.

Page 15: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 16: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 17: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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)

Page 18: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 19: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Sino (1)

Page 20: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 21: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 22: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

cociente(a,b)

No recursivo

Recursivo

Page 23: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 24: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 25: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 26: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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)

Page 27: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 28: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Caso base

Caso gral.

Caso gral.

Page 29: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Caso gral.

Caso gral.

Page 30: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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.

Page 31: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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

Page 32: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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.

Page 33: Concepto Algoritmos recursivos Seguimiento de la recursión · Ejemplo: invertir un entero, cantidad de dígitos de un número. • Cuando obtener una solución iterativa sea mucho

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