12 solucion de problemas con recursion

31
3.2 Solución de problemas 3.2 Solución de problemas usando usando recursión recursión Apoyo SSD5 Apoyo SSD5

Upload: uvm

Post on 10-Aug-2015

7.077 views

Category:

Documents


4 download

TRANSCRIPT

3.2 Solución de problemas 3.2 Solución de problemas usando usando recursiónrecursión

Apoyo SSD5Apoyo SSD5

Mtl Lourdes CahuichMtl Lourdes Cahuich 22

ObjetivoObjetivo

�� En esta sección veremosEn esta sección veremos algunas técnicas algunas técnicas de solución de problemas que usan de solución de problemas que usan recursión.recursión.

�� Como veremos, la recursión es una Como veremos, la recursión es una poderosa herramienta que puede ser poderosa herramienta que puede ser usada para crear soluciones refinadas usada para crear soluciones refinadas

Mtl Lourdes CahuichMtl Lourdes Cahuich 33

Divide y VencerásDivide y Vencerás

�� Divide y vencerásDivide y vencerás es una técnica de es una técnica de solución de problemas que utiliza la solución de problemas que utiliza la recursión para solucionar un problema recursión para solucionar un problema "dividiendo" el problema en "dividiendo" el problema en subproblemassubproblemasmás pequeños. más pequeños.

Mtl Lourdes CahuichMtl Lourdes Cahuich 44

Divide y VencerásDivide y Vencerás

�� El caso base de la recursión soluciona el El caso base de la recursión soluciona el grupo de grupo de subsub--problemas más pequeños.problemas más pequeños.

�� Luego la porción "vencerás" de esta Luego la porción "vencerás" de esta técnica de solución de problemas, técnica de solución de problemas, combina estas soluciones para crear la combina estas soluciones para crear la solución del problema original.solución del problema original.

Mtl Lourdes CahuichMtl Lourdes Cahuich 55

Divide y VencerásDivide y Vencerás

�� Por lo general, los algoritmos divide y Por lo general, los algoritmos divide y vencerás utilizan dos llamadas de la vencerás utilizan dos llamadas de la función recursiva.función recursiva.

�� Al tener dos llamadas recursivas Al tener dos llamadas recursivas continuamente divide el espacio del continuamente divide el espacio del problema en dos partes problema en dos partes

Mtl Lourdes CahuichMtl Lourdes Cahuich 66

Mtl Lourdes CahuichMtl Lourdes Cahuich 77

�� Cuando la recursión alcanza el caso base, Cuando la recursión alcanza el caso base, los los subsub--problemas se resuelven problemas se resuelven directamente.directamente.

�� Luego, las soluciones a estos Luego, las soluciones a estos subsub--problemas se combinan y eventualmente problemas se combinan y eventualmente forman la solución para el problema forman la solución para el problema original original

Mtl Lourdes CahuichMtl Lourdes Cahuich 88

Divide y VencerásDivide y Vencerás

�� La función La función find_smallestfind_smallest determina el determina el elemento más pequeño almacenado en un elemento más pequeño almacenado en un arreglo, dividiendo continuamente el arreglo, dividiendo continuamente el arreglo en dos piezas más pequeñas. arreglo en dos piezas más pequeñas.

Mtl Lourdes CahuichMtl Lourdes Cahuich 99

#include <#include <iostreamiostream>>#include <#include <cstdlibcstdlib>>using namespace std;using namespace std;intint find_smallest(intfind_smallest(int a[], a[], intint size) {size) {

if (size == 1) {if (size == 1) {return a[0]; // base casereturn a[0]; // base case

} else {} else {// Search the first half for the smallest element.// Search the first half for the smallest element.

intint s1 = s1 = find_smallest(afind_smallest(a, size / 2);, size / 2);// Search the second half of the array// Search the second half of the arrayintint s2 = s2 = find_smallest(afind_smallest(a + size / 2, size + size / 2, size -- size / size /

2);2);return (s1 < s2) ? s1 : s2;return (s1 < s2) ? s1 : s2;

}}}}intint main(intmain(int argcargc, char* , char* argvargv[]) {[]) {

intint arrarr[] = {13, 19, 12, 11,[] = {13, 19, 12, 11,15, 19, 23, 12,15, 19, 23, 12,13, 22, 18, 19,13, 22, 18, 19,14, 17, 23, 21};14, 17, 23, 21};

coutcout << "smallest: " << << "smallest: " << find_smallest(arrfind_smallest(arr, 16) << , 16) << endlendl;;

returnreturn EXIT_SUCCESSEXIT_SUCCESS;;} }

Mtl Lourdes CahuichMtl Lourdes Cahuich 1010

Divide y VencerásDivide y Vencerás

�� Cuando estas piezas son lo Cuando estas piezas son lo suficientemente pequeñas para contener suficientemente pequeñas para contener solamente un elemento, el algoritmo solamente un elemento, el algoritmo compara los elementos almacenados en compara los elementos almacenados en las dos piezas y regresa el elemento más las dos piezas y regresa el elemento más pequeño.pequeño.

3.2.2 3.2.2 Vuelta Atrás Vuelta Atrás ((BacktrackingBacktracking) )

Mtl Lourdes CahuichMtl Lourdes Cahuich 1212

El ConceptoEl Concepto

�� Vuelta atrás o "Vuelta atrás o "backtrackingbacktracking"" es una es una técnica de solución de problemas que técnica de solución de problemas que involucra examinar todas las posibilidades involucra examinar todas las posibilidades en la búsqueda de una solución.en la búsqueda de una solución.

�� Un ejemplo de Un ejemplo de vuelta atrásvuelta atrás puede verse puede verse en el proceso de búsqueda de solución a en el proceso de búsqueda de solución a un laberinto.un laberinto.

Mtl Lourdes CahuichMtl Lourdes Cahuich 1313

BacktrackingBacktracking

�� Durante la exploración de un laberinto, Durante la exploración de un laberinto, tenemos que tomar decisiones que tenemos que tomar decisiones que involucran la ruta a explorar.involucran la ruta a explorar.

�� Cuando nos enfrentamos con una Cuando nos enfrentamos con una elección de diversas rutas a explorar, elección de diversas rutas a explorar, decidimos si ir hacia el norte, sur, este u decidimos si ir hacia el norte, sur, este u oeste. oeste.

Mtl Lourdes CahuichMtl Lourdes Cahuich 1414

Vuelta atrásVuelta atrás

�� Un enfoque de Un enfoque de vuelta atrásvuelta atrás para encontrar para encontrar la ruta a través del laberinto involucra la ruta a través del laberinto involucra considerar todas las rutas posibles hasta considerar todas las rutas posibles hasta que encontremos la solución.que encontremos la solución.

Mtl Lourdes CahuichMtl Lourdes Cahuich 1515

Mtl Lourdes CahuichMtl Lourdes Cahuich 1616

Vuelta atrásVuelta atrás

�� Vuelta atrásVuelta atrás involucra seguir una posible involucra seguir una posible solución hasta que el algoritmo determine solución hasta que el algoritmo determine si es o no una solución.si es o no una solución.

�� Si un algoritmo Si un algoritmo vuelta atrásvuelta atrás descubre que descubre que la posibilidad seleccionada no es una la posibilidad seleccionada no es una solución, el algoritmo "retrocede" y solución, el algoritmo "retrocede" y selecciona seguir otra posibilidad del selecciona seguir otra posibilidad del conjunto de soluciones posibles conjunto de soluciones posibles

Mtl Lourdes CahuichMtl Lourdes Cahuich 1717

Vuelta atrásVuelta atrás

�� Los algoritmos Los algoritmos vuelta atrásvuelta atrás que usan que usan recursión operan básicamente de la recursión operan básicamente de la misma forma que otros algoritmos misma forma que otros algoritmos recursivos. recursivos.

Mtl Lourdes CahuichMtl Lourdes Cahuich 1818

Vuelta atrásVuelta atrás

�� De manera similar a cualquier otro De manera similar a cualquier otro algoritmo recursivo, los programadores algoritmo recursivo, los programadores diseñan algoritmos diseñan algoritmos vuelta atrásvuelta atrás alrededor alrededor de casos base que son resueltos sin de casos base que son resueltos sin recursiónrecursión

Mtl Lourdes CahuichMtl Lourdes Cahuich 1919

Vuelta atrásVuelta atrás

�� Los algoritmos Los algoritmos vuelta atrásvuelta atrás recursivos recursivos también reducen un problema en también reducen un problema en subsub--problemas más pequeños.problemas más pequeños.

�� La recursión, aplicada al ejemplo del La recursión, aplicada al ejemplo del laberinto, efectivamente hace el laberinto laberinto, efectivamente hace el laberinto más y más pequeño hasta que alcanza el más y más pequeño hasta que alcanza el caso base.caso base.

Ejemplo: ocho reinasEjemplo: ocho reinas

Uso de algoritmo “vuelta atrás”Uso de algoritmo “vuelta atrás”

Mtl Lourdes CahuichMtl Lourdes Cahuich 2121

Ocho ReinasOcho Reinas

�� Un problema clásico que podemos Un problema clásico que podemos resolver usando resolver usando vuelta atrásvuelta atrás es el es el problema de las problema de las Ocho ReinasOcho Reinas..

�� Este difícil problema trata de acomodar Este difícil problema trata de acomodar ocho reinas sobre un tablero de ajedrez ocho reinas sobre un tablero de ajedrez de manera que dos reinas no se ataquen de manera que dos reinas no se ataquen una a otra una a otra

Mtl Lourdes CahuichMtl Lourdes Cahuich 2222

Ocho ReinasOcho Reinas

�� El juego de ajedrez es jugado sobre un El juego de ajedrez es jugado sobre un tablero que tiene 64 cuadros de colores tablero que tiene 64 cuadros de colores alternantes.alternantes.

�� Dos jugadores toman turnos para mover Dos jugadores toman turnos para mover un conjunto de piezas sobre estos un conjunto de piezas sobre estos cuadros. cuadros.

Mtl Lourdes CahuichMtl Lourdes Cahuich 2323

Ocho ReinasOcho Reinas

�� El objetivo del juego es capturar la pieza El objetivo del juego es capturar la pieza más importante del oponente, el "rey". más importante del oponente, el "rey". Mientras que el rey es la pieza más Mientras que el rey es la pieza más importante, la "reina" es la pieza más importante, la "reina" es la pieza más poderosa. poderosa.

�� En el juego de ajedrez, las reinas pueden En el juego de ajedrez, las reinas pueden "atacar" o "capturar" otras piezas de dos "atacar" o "capturar" otras piezas de dos maneras diferentes. maneras diferentes.

Mtl Lourdes CahuichMtl Lourdes Cahuich 2424

Ocho ReinasOcho Reinas

�� Primero, una reina puede atacar piezas Primero, una reina puede atacar piezas sobre aquellos cuadros que se encuentren sobre aquellos cuadros que se encuentren en la misma fila o la misma columna que en la misma fila o la misma columna que la reina. la reina.

�� Segundo, una reina puede atacar piezas Segundo, una reina puede atacar piezas que ocupan los cuadros que corren de que ocupan los cuadros que corren de forma diagonal a través del cuadro que forma diagonal a través del cuadro que ocupa la reina ocupa la reina

Mtl Lourdes CahuichMtl Lourdes Cahuich 2525

Mtl Lourdes CahuichMtl Lourdes Cahuich 2626

Ocho ReinasOcho Reinas

�� Una reina es considerada la pieza más Una reina es considerada la pieza más poderosa del ajedrez debido a que ataca poderosa del ajedrez debido a que ataca el número más grande de cuadros que el número más grande de cuadros que cualquier otra pieza. cualquier otra pieza.

Mtl Lourdes CahuichMtl Lourdes Cahuich 2727

�� ¿Son tan poderosas las reinas que ocho ¿Son tan poderosas las reinas que ocho de ellas no pueden ser colocadas sobre de ellas no pueden ser colocadas sobre un tablero sin que dos de ellas se ataquen un tablero sin que dos de ellas se ataquen una a la otra? una a la otra?

Mtl Lourdes CahuichMtl Lourdes Cahuich 2828

Ocho ReinasOcho Reinas

�� Recuerda, al considerar la solución a este Recuerda, al considerar la solución a este problema debes asegurarte de no colocar problema debes asegurarte de no colocar dos reinas en la misma fila o en la misma dos reinas en la misma fila o en la misma columna. columna.

�� Para complicar más el asunto, tampoco Para complicar más el asunto, tampoco puedes colocar dos reinas en la misma puedes colocar dos reinas en la misma diagonal diagonal

Mtl Lourdes CahuichMtl Lourdes Cahuich 2929

La SoluciónLa Solución

�� Para resolver el problema de las Para resolver el problema de las Ocho Ocho ReinasReinas, usamos un algoritmo , usamos un algoritmo vuelta atrásvuelta atrás. .

�� El algoritmo involucra la colocación de El algoritmo involucra la colocación de reinas en el tablero, columna por columna. reinas en el tablero, columna por columna.

�� El algoritmo termina cuando coloca las El algoritmo termina cuando coloca las ocho reinas sobre el tablero si tener dos ocho reinas sobre el tablero si tener dos reinas que se ataquen una a la otra. reinas que se ataquen una a la otra.

Mtl Lourdes CahuichMtl Lourdes Cahuich 3030

Solución a Ocho ReinasSolución a Ocho Reinas

�� El algoritmo regresa cuando llega a una El algoritmo regresa cuando llega a una situación en la que una nueva reina no situación en la que una nueva reina no puede ser colocada en el tablero sin puede ser colocada en el tablero sin atacar a una reina que ya se encuentre en atacar a una reina que ya se encuentre en élél

�� Cuando el algoritmo alcanza esta Cuando el algoritmo alcanza esta situación mueve a otro lugar la pieza situación mueve a otro lugar la pieza agregada más recientemente en el agregada más recientemente en el tablero. tablero.

Mtl Lourdes CahuichMtl Lourdes Cahuich 3131

Solución a Ocho ReinasSolución a Ocho Reinas

�� La idea aquí es que mover esta pieza La idea aquí es que mover esta pieza puede crear una combinación que permita puede crear una combinación que permita que el algoritmo añada más piezas.que el algoritmo añada más piezas.

�� Eventualmente, el algoritmo repite este Eventualmente, el algoritmo repite este proceso de colocar reinas y retroceder proceso de colocar reinas y retroceder hasta que encuentra la combinación que hasta que encuentra la combinación que soluciona el problema. soluciona el problema.