Recursividad

28
Lester Sánchez Díaz Universidad de La Habana

Transcript of Recursividad

Lester Sánchez DíazUniversidad de La Habana

Recursión (Recursividad)

Procedimiento de resolver un problema complejoreduciéndolo en uno o más subproblemas

1. Con la misma estructura que el problema original

2. Más simples de resolver que el problema original

A su vez cada subproblema se divide, usando el mismo procedimiento, en subproblemas aún mássimples

Los subproblemas llegarán a ser tan simples que no hará falta dividirlos para resolverlos

La solución del problema inicial se obtienecombinando las soluciones de cada subproblema

Programación, UH 2013-2014 2

Recursividad en la vida cotidiana

•Recorrer un trayecto de un origen a un destino‐ Dar un paso desde el origen hacia el destino‐ Dar (n-1) pasos hacia el destino desde el nuevo origen

•Subir una escalera‐ Subir un escalón

‐ Subir los (n-1) escalones restantes

•Comerse una pizza (o cualquier otra cosa)‐ Comerse una porción‐ Comerse las (n-1) porciones restantes

Programación, UH 2013-2014 3

Recursividad en la vida cotidiana

Distribuir productos que se importan al país para la venta a la población en la red minorista de mercados

Ejemplo: Distribuir 1000 toneladas de arroz para 1000 mercados (1 tonelada para cada uno)

Programación, UH 2013-2014 4

Distribuir directamente desde el puerto a los mercados no resulta práctico

• Dividir el total en partes según la cantidad de provincias• Enviar a cada provincia una parte, y que cada provincia se

encargue de la distribución de su parte• A su vez, cada provincia divide su parte y envía nuevas

porciones a sus municipios• Luego cada municipio vuelve a dividir su parte y la

distribuye a cada mercado minorista

Problema de distribución de mercancía

Programación, UH 2013-2014 5

1000 ton

1 2 10...100 ton

1 210 ton 10

1 1 101 ton

...

...

PAIS

PROVINCIA

MUNICIPIO

MERCADO

Los subproblemas son cada vez más pequeños, y llega un momento en que no hace falta dividirlos para resolverlos

Estructura general de un algoritmorecursivo

Programación, UH 2013-2014 6

Algoritmo RECURSIVO

IF (Problema Simple)

Resolverlo directamente

ELSE

Dividir en subproblemas P1, P2, ..., Pn

Resolver(P1); Resolver(P2); ... Resolver(Pn)

Combinar las soluciones de cada subproblema

Condiciónde Parada

Caso Base Resolver de manera

recursiva

Programación, UH 2013-2014 7

Algoritmo para guardar las Matrioskas

Programación, UH 2013-2014 8

Guardar Matrioskas (n)

IF (n > 1)

Abrir Matrioska n

Guardar Matrioskas (n-1)

Colocar n-1 dentro de n

Cerrar Matrioska n

Subproblema

6 5 4 3 2 1

CASO BASE 1 Matrioska

SUBPROBLEMA Guardar n-1 Matrioskas

Ejemplo: Factorial

Programación, UH 2013-2014 9

FACT(n)1, n = 0

n * FACT(n-1) , n > 0

FACT(5) = 1 * 2 * 3 * 4 * 5 = 120

FACT(5) = 5 * FACT(4)

4 * FACT(3)

3 * FACT(2)

2 * FACT(1)

1 * FACT(0)

1

DefiniciónRecursiva

de Factorial

Caso Base

1 * 1

2 * 1 * 1

3 * 2 * 1 * 1

4 * 3 * 2 * 1 * 1

5 * 4 * 3 * 2 * 1 * 1 120

División en subproblemas

Combinarsoluciones de los

subproblemas

Solución del problema original

Ejemplo: Factorial

Programación, UH 2013-2014 10

Iterativo

Recursivo

Caso Base

SubproblemaConverge al caso base

Torres de Hanoi

Programación, UH 2013-2014 11

Tenemos en una estaca una pila de discos de mayor a menor y queremos pasarlos a la tercera estaca usando la del medio como auxiliar, pero solo se puede mover un disco a la vez y nunca se puede poner un disco de mayor tamaño sobre uno menor

¿Cómo mover cualquier cantidad de discos?

ORIGEN AUXILIAR DESTINO

Torres de Hanoi

Programación, UH 2013-2014 12

CASO BASEMover 1 disco de ORIGEN a DESTINO

ORIGEN AUXILIAR DESTINO

Torres de Hanoi

Programación, UH 2013-2014 13

SUBPROBLEMASi la cantidad de discos es mayor que 11. Mover (n-1) discos de ORIGEN a AUXILIAR2. Mover el disco que queda en ORIGEN para DESTINO3. Mover los (n-1) de AUXILIAR a DESTINO

Torres de Hanoi

Programación, UH 2013-2014 14

ORIGEN AUXILIAR DESTINO

Caso Base

Subproblema

Subproblema

Torres de Hanoi

Programación, UH 2013-2014 15

Caso Base de la recursión

Converge al caso base

Converge al caso base

DEMOTorres de Hanoi

Programación, UH 2013-2014 16

Intente hacerlo sin recursividad

Fractales: Copo de Nieve

Programación, UH 2013-2014 17

Construcción de un fractal con forma de Copo de Nieve

Figura que a distintas escalas presenta la misma forma geométrica

Fractales: Triángulo de Sierpinski

Programación, UH 2013-2014 18

Ejemplo: Fractales

Programación, UH 2013-2014 19

Ejemplo: Fractales

Programación, UH 2013-2014 20

Caso Base

Resolver subproblema

DEMOFractales

Programación, UH 2013-2014 21

Ejemplo: Fibonacci

Programación, UH 2013-2014

FIB(n)0, n = 01, n = 1FIB(n-1) + FIB(n-2), n > 1

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …

Fib(4)

Fib(3)

Fib(2)

Fib(1)

Fib(1)

Fib(0)

Fib(2)

Fib(1)

Fib(0)

Fib(5)

Fib(3)

Fib(2)

Fib(1)

Fib(1)

Fib(0)

Fib(2)

Fib(1)

Fib(0)

FIB(5) = FIB(4) + FIB(3)Se repite el cálculoinnecesariamente

Converge al caso base

Converge al caso base

Intente buscar el término 50 con este algoritmo y veacuánto demora. Pruebe con la variante interativa.

Reglas para aplicar la Recursividad1. Descomponer el problema original en

subproblemas más simples del mismo tipo

2. Resolver los subproblemas, usando el mismométodo, y combinar sus soluciones para generar la solución del problema original

3. La subdivisión en subproblemas siempre debeconverger a un caso base que se puedaresolver sin necesidad de subdividir

Programación, UH 2013-2014 24

Confiar en la recursividad!

Programación, UH 2013-2014 25

Clase Práctica

Calcular una base elevada a una potencia

2^3 = 2 * 2 * 2 = 8

6^4 = 6 * 6 * 6 * 6 = 1296

long Potencia(int base, int exponente)

Multiplicar dos números sin utilizar el operador *

21 * 3 = 21 + 21 + 21 = 63

2 * 24 = 24 + 24 = 48

Su solución debe hacer el menor número posible de llamadosrecursivos

long Producto(int a, int b)

Programación, UH 2013-2014 26

Clase Práctica

Determinar si un número es SuperPrimo.

Un número SuperPrimo si es primo y además al quitarle la última cifra sigue siendo SuperPrimo. Un número primo de una cifra se considera SuperPrimo.

bool EsSuperPrimo(int n)

Implemente un método que determine si una cadena espalíndromo

bool EsPalindromo(string s)

Programación, UH 2013-2014 27

Clase Práctica

Implemente un método int TerminoWirth(int n) quedevuelva el término n-ésimo perteneciente al conjunto de Wirth.

Conjunto de Wirth (W)

1 W

Si x W

Programación, UH 2013-2014 28

2x + 1 W 3x + 1 W

Clase Práctica (Lab)

Programe un método que permita al usuario escribir en la Consola tantas líneas como quiera. Cuando el usuario de “ENTER” sin haber escrito algún texto, debe imprimir cadauna de las líneas que escribió el usuario, pero en ordeninverso.

No debe usar ninguna estructura de datos para almacenartodas las líneas que escribe el ususario.

Modifique el ejemplo de fractales visto en la clase para generar el Triángulo de Sierpinski.

Programe un algoritmo para generar un fractal con forma de copo de nieve.

Programación, UH 2013-2014 29