UNIDAD 5: RECURSIVIDAD
5.1 Naturaleza de la recursividad
Es donde se desarrolla paso a paso la recursividad donde cumple ciclo de repetición. Donde Donde obtendremos obtendremos los resultados resultados tangible precisos precisos que siguiendo siguiendo cada detalle verán de manera clara y sencillo determinando cada enunciado. La recursivid recursividad ad obtiene obtiene funciones funciones,, procedimie procedimientos ntos.. recursivo recursivo cuando cuando forma parte de sí mismo. Donde no utilizaremos la recursividad Cuando la recursividad del enunciado del problema no se puede eecutar y no podremos evaluar conforme a los datos obtenidos donde el desarrollo del algoritmo para conocer veremos con el siguiente esquema
Es donde conoceremos las condiciones condiciones
• • • •
!i " factorial es # entonces va ser igual a $. !i " factorial es mayor a # entonces " %&"'$( es el numero factorial. !i " es igual a # y $ entonces el resultado de la serie va ser igual a $. !) " es mayor ma yor a $entonces *ibonacci &"'$( +*ibonacci&"'(.
Leonardo Leonardo de pisa tambi-n tambi-n conocido conocido como *ibonacci *ibonacci &$$ &$$#'$/ #'$/#( #( conocido conocido como matemático italiano donde implanto la serie *ibonacci que nos dice 0es una sucesión infinita de n1meros naturales, la sucesión empieza de # y $2. &3erzales, #$/(
4ara entender mostraremos un eemplo practico
5.2 Función de la recursividad
La función es recursiva cuando se define en sus mismas funciones .la mayaría de las funciones no se pueden llamar así misma, sino que deben ser dise5ada para que sean recursiva. "o todos los lenguaes de programación uno puede utilizar la recursividad. El lenguae de C++ permite la recursividad. 6l momento de llamar una función, se crea un uego de variable de este modo la función se llama a sí misma y se almacena su variable con su parámetro. 6l momento de retornar se recupera la variable y sus parámetros y se contin1a en el punto de que 7a sido llamada. Eemplos de recursividad 1. as !"rres !"rres de #anói:
Es un claro eemplo de recursividad que más adelante en este capítulo lo vamos a e8plicar
2. N$%er"s &act"riales e'e%(l" de recursividad
El numero factorial se simboliza como n9, y se lee como :n factorial:, su concepto es; "
ay algunas reglas que debemos tener en cuenta al momento de plantear nuestro código de programación; • •
La factorial # es igual $. "o 7ay n1mero negativo factorial.
?9 =?%%$=@&entonces la factorial de ? es @(. 67ora lo vamos implementar en en código de programación. programación.
E8isten dos tipos o formas o recursividad que son; directa o simple, e indirecta mutua o cruzada. *actorial con recursividad directa; se llama recursividad directa cuando su función se contiene a sí misma. &3rust, #$#(
/..$ Aecursividad indirecta; funciones recursivas.
Eemplo de funciones recursivas indirectas
/.. Condición de la terminación de la recursión
La condición de la terminación de la recursión tambi-n es conocida como caso base, esta indica el final de las llamadas recursivas y la realización de esta evita que entre en ciclos infinitos, esto nos lleva a la ley de recurrencia
/.? la recursividad vs interasion en c++ Como ya 7emos estudiado anteriormente que es recursividad tenemos claro lo que es pero la iteración i teración no sabes lo que nos quiere decir )Ent"nces *ue es iteración+
Es la repetición de una serie de instrucciones en softBare de computadora Conociendo ya lo que es iteración 7ay 7a y que preguntarnos, pero si la recursividad tamb tambii-n n es repe repetitici cion ones es,, ento entonc nces es Cuá Cuáll es la seme semea anz nza a en que que los los algoritmos iterativos realizan ciclos y se detienen cuando una condición se cumple y los algoritmos recursivos se llaman a sí mismo. !eg1n el libro de como programar en c++ en la página #@ nos dice que la la recursividad tiene muc7a desventaa. por el motivo que invoco de manera repetividad y la consecuencia es que sobrecarga, de llamada a la función. esto puede ser muy costos tanto al programarlo como al espacio a la memoria y y por qu- 4orque cada llamada genere otra copia de la función que estoy llamado y esto 7ace que se consuma una cantidad de espacio en la memoria. En cambio, de la iteración por lo general ocurre dentro de una solo función y el uso de memoria sea ine8istente. )Ent"nces ("r*ue l"s (r",ra%ad"res (r",ra%ad"res (re&ieren la recursividad+
Aeflea de manera más natural el problema y genera un programa fácil de entender y de usar. en una empresa lo que se busca es solucionar el programa más pronto posible. Famos 7acer un cuadro de las ventaas y desventaas de la recursividad y iteración.
Recursividad venta'a S"luci"na (r",ra%a recurrentes S"n (r",ra%a c"rt"s
desventa'a
Creación de muc7as variables Gcupan muc7a memoria
Interacción venta'as N" reduce códi," C"nsu%" de %e%"ria
desventa'as
La solución no es muy buena Huy complea la solución
5.-.1 Directrices en la t"%a de decisi"nes iteraciónrecursión.
Da a conocer identificar de manera clara donde podrán desarrollar con paso a paso de manera sencilla demostrando cuando debe plantear los eercicios Donde compartirán ente recursión e interacción, pero son resultados iguales Donde cada una de ellas tienes distinto procedimiento cuando el programa puede que transformarse en interactivo y viceversa Fentaa Aecursividad Aespuestas claras y sencillas Aepuesta meor presentada Aespuesta de problemas compleas
Desventaa )neficiencia >abrá momentos que se sobre cargar el resultado Jn result resultado ado podrá podrá genera generarr varia variass respuestas
/.I Aecursividad infinita Jna recursión infinita ocurre cuando el bucle nunca se vuelve falso, para evitar esto tenemos que ponerle una condición inicial en la que no se pueda llamar a sí mismo. Esto en realidad indica que la recursión infinita no es nada más que una recursividad llamando a otra de manera constante y dic7a función se eecutara 7asta que la computadora agote la memoria disponible
5.5 Al,"rit%"s divide / vencer0s
Este es uno de los m-todos que se utilizan para la resolución de problemas que usan recursividad al dividir el problema en dos o más subproblemas se puede construir fácilmente una solución del problema general E8isten ciertos tipos de característica que deben cumplir los problemas para que puedan utilizar esta t-cnica El problema original no debe perder su forma inicial al momento de ser divido Los problemas deben ser disuntos Debe ser posible combinar las soluciones individuales para obtener la global.
&Kodte, #$#(
5.5.1 !"rres de #anói
En el capítulo anterior se trató el tema de divide y vencerás usualmente las torres >anói utilizan este m-todo, el cual consiste en dividir las piezas en partes movi-ndolo de un e8tremo a otro 7asta conseguir el resultado deseado
C"%" crear c"n c tu (r"(i" #anói
5.5.2 $s*ueda recursiva 3inaria
la b1squeda recursiva binaria no es más que un atao 7acia una base de datos, es decir es un programa dise5ado para buscar los datos de cierta base de datos de manera rápida eemplo;
5.4 rdenación ("r %ezclas
Este es un tipo de algoritmo recursivo que facilita el arreglo de un array
5.6 ac7 trac7in,8 al,"rit%"s de vuelta atr0s.
Fuelta atrás o &36CMNA6CM)"O( es una estrategia donde podemos encontrar soluciones al problema que satisfacen restricciones. De donde viene el t-rmino 036CMNA6CMP nació del matemático estadounidense Le7mer D.> en la d-cada de $Q/#. De&inición
La idea del bactracing está dirigido a la idea que tenemos de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no contiene cicl ciclos os.. El obe obetiv tivo o de este este m-to m-todo do es enco encont ntra rarr la solu soluci ción ón a cual cualqu quie ier r problema. Esto se logra 7aciendo soluciones momentáneas a media que se 7ace el algoritmoR estas soluciones momentáneas limitan las regiones en las que se puede encontrar una solución completa.
Caracter Cara cter9st 9stica ica
Es una t-cnica general de resolución del problema para obtener una solución. Aealiza b1squeda y sistemática en el espacio de soluciones y por eso que es un m-todo ineficiente. La solución de un problema se puede e8presar como una tupla donde se satisfacen las restricciones. El algoritmo se encuentra en un cierto nivel pero con una solución parcial.
5.6.1 r"3le%a del salt" de ca3all"
En el a'edrez
El caballo es un elemento muy importante en el uego del aedrez se distingue de las otras piezas por su forma de moverse que es en forma de L, es decir que sus movimientos se desplaza dos casillas en dirección oeste y norte con una dirección perpendicular a la anterior que es a un ángulo de Q# grado. Hartin l S )ngo B proclamaron que el n1mero que podía dar un caballo en un tabl tabler ero o de aed aedre rezz era era de ??.I ??.I?Q ?Q.$ .$? ?.I .IT? T?. .QI QI obtuv obtuvie iero ron n ese ese resu resultltad ado o trabaando por I meses. )Sa39as *ue+
Uue un ser 7umano podría contar 7asta un millón en $###### segundo=$@@@@,@@minutos=,7or segundo=$@@@@,@@minutos=,7oras=$$ as=$$,/dias ,/dias Jnos $ día sin parar a vimos lo que es el caballo en el uego del aedrez y sabes que la pieza que se puede diferenciar de las otras piezas a7ora vamos ver cómo podemos implementarlo en el momento de 7acer un algoritmo tanto en ava como en c+ +. El salt salto o de caba aballo llo es un vieo ieo prob roblema lema que e8iste iste ante ante de que que los los ordenadores e8istieran, en la cual consiste es una posición inicial en un tablero de aedrez y recorreros el tablero en forma de L sin repetirse ninguna casilla. >ay un m-todo que nos dice que se debe visitar primero las casillas con lo menos posible movimiento y es así que se 7a 7ec7o una función que analizara los posibles movimientos de los alrededores y ordenar la lista de movimiento de menor a mayor. El uego consiste en que un tablero de T%T es decir @I posiciones diferente, es lo que se puede tener en un tablero de aedrez.
as"s (ara realizar el al,"rit%"
el tablero de aedrez &T8T( se llena con # en todas las entradas e8cepto en la esquina superior derec7a, se coloca un $ y es donde el caballo va a comenzar se lanza un par de 0dados2 de oc7o caras el primer dado es donde decide el reglón el siguiente es donde se decide la columna. Jna regla del aedrez es que el caballo no allá pasado por ese casillero y es por eso que 7ay que verificar si es verdad o no verdad y por eso que vamos a poner un # y si al verificar no me da # entonces se vuelve 7acer el paso dos y si me da # entonces verificamos que la casilla que caiga el caballo sea real que quiere decir que se cumpla la forma de la L. para este se verifica la distancia en V y . !i el valor absoluto de la diferencia entre la casilla elegida por el dado y la casilla 8 actual es igual a # $.
!e procede a c7ecar que el valor absoluto de la distancia entre el dado y .$ 4ara el primer paso y el para el segundo, segundo, indican indican que la casilla casilla es valida.se valida.se procede a poner el numero &o ? o I o / o el que sea( en la casilla que se indica es la siguiente casilla donde se va a poner el caballo y es así donde se incrementa la variable contadora y se procede de esa manera.
Al,"rit%" del salt" del ca3all" en 'ava
Al,"rit%" del salt" del ca3all" en c
5.6.2 (r"3le%a de las "c;" reina
oc7o reinas y en general la de las n reina. donde dispondremos de un tablero de aedrez de T%T 4asos se trata de colocar colocar en las oc7o reinas de manera que no se amenacen amenacen seg1n seg1n las reglas del aedrez, es decir que no se topen las dos reinas ni en la misma fila .ni en la misma columna, ni diagonalmente. numeramos las reinas del $ al T. cualquiera solución a este problema estará visualizado por una T'tupla Wz$, z, z?, zI, z/, z@, z, zTXen que cada si representa la columna donde se encuentra la reina de la fila i'esima. Jna probable solución es la tupla [email protected]...$.?./X. para tomas cuales son los valores que se puede tomar cada uno del elemento zi, 7emos de considerar las restricciones al fin de que el n1mero de opciones en cada tramo sea el menor posible. En los algoritmos de vuelta atrás podemos encontrarnos con dos restricciones restricción e8plicita restricción implícita que es una restricción implícita restringe los valores que se puede tomar de un conunto determinado en problema que estábamos viendo el conunto que teníamos es != Y$,,?,I,/,@,,TZ que es una restricción implícita seg1n una fuente sacada de internet nos dice2 que la relación e8istente entre los posibles valores de los sí, para que estos puedan formar parte de una n' tupla solución. De esta esta mane manera ra y apli aplica cand ndo o las las rest restric ricci cion ones es,, en cada cada proc proces eso o iremo iremoss generando solo las 'tulpas con una posible solución.
Ent"nces c"%" ser9a la (r",ra%ación en un len,ua'e de (r",ra%ación
En este eemplo podemos ver que están tres elementos principales. En primer luga lugarr, 7ay 7ay una una gene genera raci ción ón de desc descen endi dien ente te,, en dond donde e para para cada cada nodo nodo genera generamos mos,, con con una posibl posible e soluci solución ón.. a esto esto se le denomi denomina na &e8pan &e8pansió sión, n, ramificación o bifurcación( Nalvez lo más difícil de poder observar en este esquema es donde se realiza la vuelta atrás y para ello 7emos de pensar en nuestra propia recursividad y su funcionamiento, qu- nos permite ir en lo más profundo de nuestro algoritmo. El algoritmo que lo soluciona por lo tanto es
vamos ver como se 7aría el algoritmo de vuelta atrás en su versión de interacción ya que el anterior era en su versión de recursiva ya que es un m-todo más utilizado.
En este esquema tambi-n podemos observar los tres elementos anteriores prueba de solución prueba de fracaso generación de descendiente el algoritmo interactivo para este problema de reinas pueden ser representado por tanto esquema requerido lo que nos lleva a este procedimiento .
Este es un eemplo de los muc7o que 7ay del m-todo de vuelta atrás para aprender más eemplo de este m-todo pueden ingresar a esta dirección
5.<= Res"lución Res"lu ción de (r"3le%as c"n al,"rit%"s al ,"rit%"s de vuelta vuelt a atr0s.
En el dise5o de algoritmo 7ay muc7os m-todos para poder la programación dentro de estos metodo encontramos el metodo de vuelta atrás de que se trata este metodo Es uno de los de más amplia utilización, en el sentido de se puede aplicarse dentro de un algoritmo especialmente en los problemas de optimización. El dise5o del metodo vuelta atrás proporciona una manera posible de generar todas las posibles soluciones. Jn eem eempl plo o cási cásicco que que pode podemo moss enc encontr ontrar arno noss en este este m-to m-todo do es el denominado de las
5.<.1 ,enerar las distintas variaci"nes v%8 n.
La e8presión vm,n representa las variaciones de [m[ elementos , formando subd subdiv ivis isio ione ness de [n[ [n[ elem elemen ento tos. s.en ento tonc nce e para para noso nosotro tross pode poderr calc calcul ular ar la variación de vm,n se se aplica la siguiente formula.
Escri3ir (er%utación en 'ava
En el sigu siguie ient nte e eem eempl plo o que que vamo vamoss a impl implem emen enta tarr vamos vamos a desc describ ribir ir las las permutaciones de una seria de elemento usando la recursividad.
proceso Los algoritmos recursivos son muy fáciles donde 7acemos un 3JCLE para diferenciar los elementos. y así por cada elemento, las permutaciones tenemos que escribir escribir los demás elementos anteponiendo anteponiendo el elemento anterior. Es decir, si cogemos el $ tenemos que 7acer una permutación de los demás poniendo adelante el n1mero $. a7ora coamos el y tenemos que 7acer las permu ermuta taci cio ones nes que los los dema demass eleme lement nto. o. pero pero inc incluy luyend endo el $ per pero anteponiendo es y así sucesivamente con los demas elemento. Entonces cuando acaba el procesa 6caba cuando la recursividad recursividad solo tiene un elemento elemento
E'e%(l" de (er%utaci"nes sin re(etición
5.<.2 3'et"s *ue su%an un (es".
Es donde e8iste un algoritmo greedy para poder solucionar este problema es donde donde cuando cuando las demás demás activi actividad dades es tienen tienen el mismo mismo valor valor es elegir elegir las actividades en forma creciente y decreciente y el tiempo ti empo que 7a trascurrido. Neniendo eniendo en cuenta el algoritmo greedy no funciona en forma general.
algoritmo greedy, ordenamos ordenamos las actividades por su 7ora de finalización\
)mplementación iterativa del algoritmo
Aeturn solución&meor(R (
5.>
Selecció Sele cción n ó(ti ó(ti%a. %a.
Las respuestas optimas de valores determinados donde se desarrollan una combinación de respuestas. !e busca las respuestas optimas de un problema en paso a paso de decisión 0multietapico2. Es donde toman decisiones de cada proceso que se 7aya planteado de las respuestas a los subproblemas que se componen. Eemplo; Cambio d monedas Las respuestas óptimas para #.# Es #.#/+#.# euros. La respuesta optima de #.#@ #.#/+#.#$ euros. 4rogramación optima Eemplos sucesión de *ibonacci fib&n( = fib&n ] ($ + fib&n ] ( implem implement entaci ación ón recurs recursiva iva G&ϕn( )mplementación usando programación dinámica; ^&n(
se comprueba que cumple las condiciones de optima n1meros combinatorios
combinan de n sobre p terminación inmediata utilizando
programación de triangulo pascal
orden y rápido; ^&np(
E_EH4LG DE "`HEAG! CGH3) "6C)G"6LE! combinan de n sobre p
Grden de rápido; ^&np( en tiempo, ^&np( en espacio.
5.>.1 (r"3le%a del a,ente via'er"
Es el problema más conocido en el ámbito de la elaboración de las rutas tienes muc7os algoritmos dise5ados y al ser un algoritmo muy grande vamos a dise5ar un algoritmo al menor costo posible. Es un problema muy compleo de las ciencias computacionales y 7a sido incluido en varias ramas de la ingeniera y porque se incluye en la ingeniera por distintas razones su principal aplicación es de rutiar desde distinta perspectiva, ya sea un proceso especifico o de carácter lógico. &!c7ildt, #$#(
Al,"rit%" del a,ente via'e en 'ava
Bibliografía Berzales, F. (2015). elvex . Obtenido de http://.l!!."#a.es/$al%arezp/p#/re!"rsi%idad Br"st, &. '. (2010). Programación avanzada en SQL Server 2005. stados nidos. *!hildt, +. (2010). Fundamentos de Java. *&-O Java. *&-O -O*. odte, %. . (2010). Diseño con erramientas erramientas digitales. #e3i!o. digitales. #e3i!o.