Introducción teórica para TP6-recursion Clase 1

33 

Texto completo

(1)

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.

(2)

UNIDAD 7

Recursividad: Concepto

Recursión:

(3)

UNIDAD 7

Recursividad: Concepto

«Se llama a si mismo»

(4)

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

(5)

UNIDAD 7

Recursividad: Concepto

Modulo

{

……

……

}

(6)

UNIDAD 7

Recursividad: Concepto

NO es una estructura de datos.

LA RECURSION

(7)

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.

(8)

UNIDAD 7

Tipos de Recursividad

Clasificación 2

* Lineal: El modulo se invoca a si mismo una única vez.

(9)

UNIDAD 7

Recursividad: Ejemplo I

Matemáticamente:

Pseudocódigo

:

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

(10)

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.

(11)

UNIDAD 7

Recursividad: Ejemplo I no recursivo

Ejemplo: Calcular el factorial de 7.

(12)

UNIDAD 7

Partes de una función recursiva

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

Sino n* factorial (n-1)!

Caso base

Caso general

(13)

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

(14)

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

(15)

UNIDAD 7

Recursividad: Metodología de desarrollo

Claves:

1) Identificar caso base

2) Identificar caso general

(16)

UNIDAD 7

Recursividad: ejemplo I recursivo

Ejemplo: Calcular el factorial de 7.

Caso base: La función

no recurre Caso general o recursivo: con

(17)

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:

(18)

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

(19)
(20)

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

(21)

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

(22)

cociente(a,b)

No recursivo

(23)

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

(24)

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

(25)

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:

(26)

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)

(27)

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

(28)

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

Caso base

Caso gral.

(29)

Ejemplo VI: Encontrar el mayor elemento de un vector.

Caso base

Caso gral.

(30)

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.

(31)

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.

(32)

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

.

(33)

UNIDAD 7

Recursividad: Características

VENTAJAS

DESVENTAJAS

* Soluciones simples

* Mayor costo de tiempo de

CPU

* Soluciones claras

* Mayor espacio de memoria

Figure

Actualización...

Referencias

Actualización...