Sie sind auf Seite 1von 40

UNIDAD 5: RECURSIVIDAD

5.1 Naturaleza de la recursividad

Es donde se desarrolla paso a paso la recursividad donde cumple ciclo de


repeticin. Donde obtendremos los resultados tangible precisos que siguiendo
cada detalle vern de manera clara y sencillo determinando cada enunciado.
La recursividad obtiene funciones, procedimientos. recursivo cuando forma
parte de s mismo. Donde no utilizaremos la recursividad
Cuando la recursividad del enunciado del problema no se puede ejecutar 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

Si N factorial es 0 entonces va ser igual a 1.


Si N factorial es mayor a 0 entonces N *(N-1) es el numero factorial.
Si N es igual a 0 y 1 entonces el resultado de la serie va ser igual a 1.
SI N es mayor a 1entonces Fibonacci (N-1) +Fibonacci(N-2).

Leonardo de pisa tambin conocido como Fibonacci (1170-1250) conocido


como matemtico italiano donde implanto la serie Fibonacci que nos dice es
una sucesin infinita de nmeros naturales, la sucesin empieza de 0 y 1.
(Berzales, 2015)

Para entender mostraremos un ejemplo practico

5.2 Funcin de la recursividad

La funcin es recursiva cuando se define en sus mismas funciones .la mayara


de las funciones no se pueden llamar as misma, sino que deben ser diseada
para que sean recursiva. No todos los lenguajes de programacin uno puede
utilizar la recursividad. El lenguaje de C++ permite la recursividad. Al momento
de llamar una funcin, se crea un juego de variable de este modo la funcin se
llama a s misma y se almacena su variable con su parmetro. Al momento de
retornar se recupera la variable y sus parmetros y se contina en el punto de
que ha sido llamada.

Ejemplos de recursividad
1. Las Torres de Hani:
Es un claro ejemplo de recursividad que ms adelante en este captulo lo
vamos a explicar

2. Nmeros factoriales ejemplo de recursividad


El numero factorial se simboliza como n!, y se lee como "n factorial", su
concepto es:
N va ser igual a n por n a la menos unos por n a la menos 2 y etc.
Expresndolo matemticamente nos queda as.
N! = n * (n-1) * (n-2) *... * 1

Hay algunas reglas que debemos tener en cuenta al momento de plantear


nuestro cdigo de programacin:

La factorial 0 es igual 1.
No hay nmero negativo factorial.

3! =3*2*1=6(entonces la factorial de 3 es 6).


Ahora lo vamos implementar en cdigo de programacin.

Existen dos tipos o formas o recursividad que son: directa o simple, e indirecta
mutua o cruzada.
Factorial con recursividad directa: se llama recursividad directa cuando su
funcin se contiene a s misma. (Brust, 2010)

5.2.1 Recursividad indirecta: funciones recursivas.

Ejemplo de funciones recursivas indirectas

5.2.2 Condicin de la terminacin de la recursin

La condicin de la terminacin de la recursin tambin es conocida como caso


base, esta indica el final de las llamadas recursivas y la realizacin de esta
evita que entre en ciclos infinitos, esto nos lleva a la ley de recurrencia

5.3 la recursividad vs interasion en c++


Como ya hemos estudiado anteriormente que es recursividad tenemos claro lo
que es pero la iteracin no sabes lo que nos quiere decir
Entonces que es iteracin?
Es la repeticin de una serie de instrucciones en software de computadora
Conociendo ya lo que es iteracin hay que preguntarnos, pero si la recursividad
tambin es repeticiones, entonces Cul es la semejanza? en que los
algoritmos iterativos realizan ciclos y se detienen cuando una condicin se
cumple y los algoritmos recursivos se llaman a s mismo.
Segn el libro de como programar en c++ en la pgina 206 nos dice que la la
recursividad tiene mucha desventaja. por el motivo que invoco de manera
repetividad y la consecuencia es que sobrecarga, de llamada a la funcin. esto
puede ser muy costos tanto al programarlo como al espacio a la memoria y y
por qu?
Porque cada llamada genere otra copia de la funcin que estoy llamado y esto
hace que se consuma una cantidad de espacio en la memoria.
En cambio, de la iteracin por lo general ocurre dentro de una solo funcin y el
uso de memoria sea inexistente.
Entonces porque los programadores prefieren la recursividad?
Refleja de manera ms natural el problema y genera un programa fcil de
entender y de usar.
Y en una empresa lo que se busca es solucionar el programa ms pronto
posible.
Vamos hacer un cuadro de las ventajas y desventajas de la recursividad y
iteracin.

Recursividad
ventaja
Soluciona programa recurrentes
Son programa cortos

desventaja
Creacin de muchas variables
Ocupan mucha memoria

Interaccin
ventajas
No reduce cdigo
Consumo de memoria

desventajas
La solucin no es muy buena
Muy compleja la solucin

5.3.1 Directrices en la toma de decisiones iteracin/recursin.


Da a conocer identificar de manera clara donde podrn desarrollar con paso a
paso de manera sencilla demostrando cuando debe plantear los ejercicios
Donde compartirn ente recursin e interaccin, pero son resultados iguales
Donde cada una de ellas tienes distinto procedimiento cuando el programa
puede que transformarse en interactivo y viceversa
Ventaja
Recursividad
Respuestas claras y sencillas
Repuesta mejor presentada
Respuesta de problemas complejas

Desventaja
Ineficiencia
Habr momentos que se sobre
cargar el resultado
Un resultado podr generar varias
respuestas

5.4 Recursividad infinita


Una recursin infinita ocurre cuando el bucle nunca se vuelve falso, para evitar
esto tenemos que ponerle una condicin inicial en la que no se pueda llamar a
s mismo.
Esto en realidad indica que la recursin infinita no es nada ms que una
recursividad llamando a otra de manera constante y dicha funcin se ejecutara
hasta que la computadora agote la memoria disponible

5.5 Algoritmos divide y vencers


Este es uno de los mtodos que se utilizan para la resolucin de problemas
que usan recursividad al dividir el problema en dos o ms subproblemas se
puede construir fcilmente una solucin del problema general
Existen ciertos tipos de caracterstica que deben cumplir los problemas para
que puedan utilizar esta tcnica
El problema original no debe perder su forma inicial al momento de ser divido
Los problemas deben ser disjuntos
Debe ser posible combinar las soluciones individuales para obtener la global.

(Wodtke, 2010)

5.5.1 Torres de Hani


En el captulo anterior se trat el tema de divide y vencers usualmente las
torres Hani utilizan este mtodo, el cual consiste en dividir las piezas en
partes movindolo de un extremo a otro hasta conseguir el resultado deseado

Como crear con c++ tu propio Hani

5.5.2 Bsqueda recursiva binaria


la bsqueda recursiva binaria no es ms que un atajo hacia una base de datos,
es decir es un programa diseado para buscar los datos de cierta base de
datos de manera rpida ejemplo:

5.6 Ordenacin por mezclas

Este es un tipo de algoritmo recursivo que facilita el arreglo de un array

5.7 Back tracking, algoritmos de vuelta atrs.


Vuelta atrs o (BACKTRACKING) es una estrategia donde podemos encontrar
soluciones al problema que satisfacen restricciones. De donde viene el trmino
BACKTRACK naci del matemtico estadounidense Lehmer D.H en la dcada
de 1950.
Definicin
La idea del backtracking est dirigido a la idea que tenemos de un grafo
dirigido. El grafo en cuestin suele ser un rbol, o por lo menos no contiene
ciclos. El objetivo de este mtodo es encontrar la solucin a cualquier
problema.
Esto se logra haciendo soluciones momentneas a media que se hace el
algoritmo; estas soluciones momentneas limitan las regiones en las que se
puede encontrar una solucin completa.

Caracterstica
Es una tcnica general de resolucin del problema para obtener una solucin.
Realiza bsqueda y sistemtica en el espacio de soluciones y por eso que es
un mtodo ineficiente.
La solucin de un problema se puede expresar como una tupla donde se
satisfacen las restricciones.
El algoritmo se encuentra en un cierto nivel k pero con una solucin parcial.

5.7.1 Problema del salto de caballo

En el ajedrez
El caballo es un elemento muy importante en el juego del ajedrez 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 direccin oeste y norte con
una direccin perpendicular a la anterior que es a un ngulo de 90 grado.
Martin l & Ingo w proclamaron que el nmero que poda dar un caballo en un
tablero de ajedrez era de 33.439.123.483.294 obtuvieron ese resultado
trabajando por 4 meses.
Sabas que?
Que un ser humano podra contar hasta un milln en
1000000 segundo=16666,66minutos=277,77horas=11,57dias
Unos 12 da sin parar
Ya vimos lo que es el caballo en el juego del ajedrez y sabes que la pieza que
se puede diferenciar de las otras piezas ahora vamos ver cmo podemos
implementarlo en el momento de hacer un algoritmo tanto en java como en c+
+.
El salto de caballo es un viejo problema que existe ante de que los
ordenadores existieran, en la cual consiste es una posicin inicial en un tablero
de ajedrez y recorreros el tablero en forma de L sin repetirse ninguna casilla.
Hay un mtodo que nos dice que se debe visitar primero las casillas con lo
menos posible movimiento y es as que se ha hecho una funcin que analizara
los posibles movimientos de los alrededores y ordenar la lista de movimiento de
menor a mayor.
El juego consiste en que un tablero de 8*8 es decir 64 posiciones diferente, es
lo que se puede tener en un tablero de ajedrez.

Pasos para realizar el algoritmo


el tablero de ajedrez (8x8) se llena con 0 en todas las entradas excepto en la
esquina superior derecha, se coloca un 1 y es donde el caballo va a comenzar
se lanza un par de dados de ocho caras el primer dado es donde decide el
regln el siguiente es donde se decide la columna.
Una regla del ajedrez es que el caballo no all pasado por ese casillero y es
por eso que hay que verificar si es verdad o no verdad y por eso que vamos a
poner un 0 y si al verificar no me da 0 entonces se vuelve hacer el paso dos y
si me da 0 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
X y Y. Si el valor absoluto de la diferencia entre la casilla elegida por el dado y
la casilla x actual es igual a 2 0 1.

Se procede a checar que el valor absoluto de la distancia entre el dado 2 y Y.1


Para el primer paso y el 2 para el segundo, indican que la casilla es valida.se
procede a poner el numero 2 (o 3 o 4 o 5 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.

Algoritmo del salto del caballo en java

Algoritmo del salto del caballo en c++

5.7.2 problema de las ocho reina

ocho reinas y en general la de las n reina. donde dispondremos de un tablero


de ajedrez de 8*8
Pasos
se trata de colocar en las ocho reinas de manera que no se amenacen segn
las reglas del ajedrez, 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 1 al 8. cualquiera solucin a este problema estar
visualizado por una 8-tupla [z1, z2, z3, z4, z5, z6, z7, z8]en que cada si
representa la columna donde se encuentra la reina de la fila i-esima. Una
probable solucin es la tupla [4.6.8.2.7.1.3.5].
para tomas cuales son los valores que se puede tomar cada uno del elemento
zi, hemos de considerar las restricciones al fin de que el nmero de opciones
en cada tramo sea el menor posible.
En los algoritmos de vuelta atrs podemos encontrarnos con dos restricciones
restriccin explicita
restriccin implcita
que es una restriccin implcita
restringe los valores que se puede tomar de un conjunto determinado en
problema que estbamos viendo el conjunto que tenamos es S=
{1,2,3,4,5,6,7,8}
que es una restriccin implcita
segn una fuente sacada de internet nos dice que la relacin existente entre
los posibles valores de los s, para que estos puedan formar parte de una ntupla solucin.
De esta manera y aplicando las restricciones, en cada proceso iremos
generando solo las k-tulpas con una posible solucin.

Entonces como sera la programacin en un lenguaje de programacin

En este ejemplo podemos ver que estn tres elementos principales. En primer
lugar, hay una generacin de descendiente, en donde para cada nodo
generamos, con una posible solucin. a esto se le denomina (expansin,
ramificacin o bifurcacin)

Talvez lo ms difcil de poder observar en este esquema es donde se realiza la


vuelta atrs y para ello hemos de pensar en nuestra propia recursividad y su
funcionamiento, qu nos permite ir en lo ms profundo de nuestro algoritmo.
El algoritmo que lo soluciona por lo tanto es

vamos ver como se hara el algoritmo de vuelta atrs en su versin de


interaccin ya que el anterior era en su versin de recursiva ya que es un
mtodo ms utilizado.

En este esquema tambin podemos observar los tres elementos anteriores


prueba de solucin
prueba de fracaso
generacin 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 ejemplo de los mucho que hay del mtodo de vuelta atrs para
aprender ms ejemplo de este mtodo pueden ingresar a esta direccin

5.8) Resolucin de problemas con algoritmos de vuelta atrs.

En el diseo de algoritmo hay muchos mtodos para poder la programacin


dentro de estos metodo encontramos el metodo de vuelta atrs de que se trata
este metodo
Es uno de los de ms amplia utilizacin, en el sentido de se puede aplicarse
dentro de un algoritmo especialmente en los problemas de optimizacin.
El diseo del metodo vuelta atrs proporciona una manera posible de generar
todas las posibles soluciones.
Un ejemplo csico que podemos encontrarnos en este mtodo es el
denominado de las

5.8.1 generar las distintas variaciones vm, n.


La expresin vm,n representa las variaciones de m elementos , formando
subdivisiones de n elementos.entonce para nosotros poder calcular la
variacin de vm,n se aplica la siguiente formula.

Escribir permutacin en java

En el siguiente ejemplo que vamos a implementar vamos a describir las


permutaciones de una seria de elemento usando la recursividad.

proceso

Los algoritmos recursivos son muy fciles donde hacemos un BUCLE para
diferenciar los elementos. y as por cada elemento, las permutaciones tenemos
que escribir los dems elementos anteponiendo el elemento anterior.
Es decir, si cogemos el 1 tenemos que hacer una permutacin de los dems
poniendo adelante el nmero 1. ahora cojamos el 2 y tenemos que hacer las
permutaciones que los demas elemento. pero incluyendo el 1 pero
anteponiendo es 2 y as sucesivamente con los demas elemento.

Entonces cuando acaba el procesa

Acaba cuando la recursividad solo tiene un elemento

Ejemplo de permutaciones sin repeticin

5.8.2 Objetos que suman un peso.

Es donde existe un algoritmo greedy para poder solucionar este problema es


donde cuando las dems actividades tienen el mismo valor es elegir las
actividades en forma creciente y decreciente y el tiempo que ha trascurrido.
Teniendo en cuenta el algoritmo greedy no funciona en forma general.

algoritmo greedy, ordenamos las actividades por su hora de finalizacin

Implementacin iterativa del algoritmo

Return solucin(mejor);
)

5.9

Seleccin ptima.

Las respuestas optimas de valores determinados donde se desarrollan una


combinacin de respuestas.
Se busca las respuestas optimas de un problema en paso a paso de decisin
multietapico.
Es donde toman decisiones de cada proceso que se haya planteado de las
respuestas a los subproblemas que se componen.
Ejemplo: Cambio d monedas
Las respuestas ptimas para 0.07
Es 0.05+0.02 euros.
La respuesta optima de 0.06
0.05+0.01 euros.
Programacin optima
Ejemplos sucesin de Fibonacci
fib(n) = fib(n )1 + fib(n )2
implementacin recursiva O(n)
Implementacin usando programacin dinmica: (n)

se comprueba que cumple las condiciones de optima


nmeros combinatorios

combinan de n sobre p

terminacin inmediata

utilizando

programacin de triangulo pascal

orden y rpido:
(np)

EJEMPLO DE NMEROS COMBI NACIONALES


combinan de n sobre p

Orden de rpido: (np) en tiempo, (np) en espacio.

5.9.1 problema del agente viajero

Es el problema ms conocido en el mbito de la elaboracin de las rutas tienes


muchos algoritmos diseados y al ser un algoritmo muy grande vamos a
disear un algoritmo al menor costo posible.
Es un problema muy complejo de las ciencias computacionales y ha sido
incluido en varias ramas de la ingeniera y porque se incluye en la ingeniera por
distintas razones su principal aplicacin es de rutiar desde distinta perspectiva,
ya sea un proceso especifico o de carcter lgico. (Schildt, 2010)

Algoritmo del agente viaje en java

Bibliografa
Berzales, F. (2015). elvex. Obtenido de
http://www.lcc.uma.es/~alvarezp/pm/recursividad
Brust, A. J. (2010). Programacin avanzada en SQL Server 2005. Estados
Unidos.
Schildt, H. (2010). Fundamentos de Java. ESTADO UNIDOS.
Wodtke, v. M. (2010). Diseo con herramientas digitales. mexico.

Das könnte Ihnen auch gefallen