Recursividad
-
Upload
lester-sanchez -
Category
Education
-
view
372 -
download
0
Transcript of Recursividad
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
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
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
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!
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