Sei sulla pagina 1di 10

Universidad Nacional Amaznica de Madre de Dios

Carrera Profesional de Ingeniera de Sistemas e Informtica

Anlisis y Diseo de Algoritmos

Algoritmos Recursivos
La recursividad es una tcnica fundamental en el diseo de
algoritmos eficientes, que est basada en la solucin de versiones
ms pequeas del problema, para obtener la solucin general del
mismo. Una instancia del problema se soluciona segn la solucin de
una o ms instancias diferentes y ms pequeas que ella.
Es una herramienta poderosa que sirve para resolver cierto tipo de
problemas reduciendo la complejidad y ocultando los detalles del
problema. Esta herramienta consiste en que una funcin o
procedimiento se llama a s mismo.
Una gran cantidad de algoritmos pueden ser descritos con mayor
claridad en trminos de recursividad, tpicamente el resultado ser
que sus programas sern ms pequeos.
La recursividad es una alternativa a la iteracin o repeticin, y aunque
en tiempo de computadora y en ocupacin en memoria es la solucin
recursiva menos eficiente que la solucin iterativa, existen numerosas
situaciones en las que la recursividad es una solucin simple y natural
a un problema que en caso contrario ser difcil de resolver. Por esta
razn se puede decir que la recursividad es una herramienta potente
y til en la resolucin de problemas que tengan naturaleza recursiva
y, por ende, en la programacin.
Existen numerosas definiciones de recursividad, algunas de las ms
importantes o sencillas son stas:

Un objeto es recursivo si figura en su propia definicin.

Una definicin recursiva es aquella en la que el objeto que se


define forma parte de la definicin (recuerde la regla
gramatical: lo definido nunca debe formar parte de la
definicin).

La caracterstica importante de la recursividad es que siempre existe


un medio de salir de la definicin, mediante la cual se termina el
proceso recursivo.
Ventajas:
-

Puede resolver problemas complejos.


Solucin ms natural.

Desventajas:
Docente: Ing. MGQM

Contacto: mijailgmardl@gmail.com

Universidad Nacional Amaznica de Madre de Dios


Carrera Profesional de Ingeniera de Sistemas e Informtica

Anlisis y Diseo de Algoritmos

- Se puede llegar a un ciclo infinito.


- Versin no recursiva ms difcil de desarrollar.
- Para la gente sin experiencia es difcil de programar.
Primero consideraremos la recursividad en forma conceptual.
Despus analizaremos una aplicacin que contiene un mtodo
recursivo. Los mtodos para solucionar problemas recursivos tienen
un nmero de elementos en comn. Cuando se hace la llamada a un
mtodo recursivo para resolver un problema, este mtodo en realidad
es capaz de resolver slo el(los) caso(s) ms simple(s), o caso(s)
base. Si se hace una llamada al mtodo con un caso base, el mtodo
devuelve un resultado. Si se hace una llamada al mtodo con un
problema ms complejo, ste divide el problema en dos piezas
conceptuales: una que el mtodo sabe cmo resolver y la otra que no
sabe cmo. Para que la recursividad sea factible, la pieza que no se
puede resolver debe ser similar al problema original, pero debe ser
una versin un poco ms simple o pequea de ste. Como este nuevo
problema se ve igual que el problema original, el mtodo llama a una
copia nueva de s mismo para trabajar sobre el problema ms
pequeo; a esto se le conoce como llamada recursiva y o paso de
recursividad. Por lo general, el paso de recursividad incluye una
instruccin return, ya que su resultado se combinar con la porcin
del problema que el mtodo supo cmo resolver, para formar un
resultado que se pasar de vuelta al mtodo original que hizo la
llamada.
El paso de recursividad se ejecuta mientras la llamada original al
mtodo sigue estando activa (es decir, mientras no haya finalizado la
ejecucin). El paso de recursividad puede originar muchas ms
llamadas recursivas, a medida que el mtodo divida cada nuevo
subproblema en dos piezas conceptuales. Para que la recursividad
pueda terminar en un momento dado, cada vez que el mtodo se
llama a s mismo con una versin un poco ms simple del problema
original, la secuencia de problemas cada vez ms pequeos debe
convergir en el caso base. En ese punto, el mtodo reconoce el caso
base y devuelve un resultado a la copia anterior del mtodo. Despus
se produce una secuencia de instrucciones return hasta que la
llamada original al mtodo devuelve el resultado al mtodo que hizo
la llamada. Este proceso suena complejo en comparacin con la
solucin convencional de problemas que hemos realizado hasta
ahora.
Ejercicios:
Clculos recursivos del factorial

Docente: Ing. MGQM

Contacto: mijailgmardl@gmail.com

Universidad Nacional Amaznica de Madre de Dios


Carrera Profesional de Ingeniera de Sistemas e Informtica

Anlisis y Diseo de Algoritmos


Como ejemplo del funcionamiento de los conceptos de recursividad,
escribiremos una aplicacin recursiva para realizar un clculo
matemtico popular. Considere el factorial de un entero n no
negativo, que se escribe como n! (y se pronuncia como factorial de
n), y que es el producto:
n (n 1) (n 2) 1
1! es igual a 1 y 0! se define tambin como 1. Por ejemplo, 5! es el
producto 5 4 3 2 1, que es igual a 120.
El factorial de un entero llamado nmero mayor o igual a 0 puede
calcularse en forma iterativa (sin recursividad) mediante el uso de la
siguiente instruccin for:
factorial = 1;
for ( int contador = numero; contador >= 1; contador-- )
factorial *= contador;

Para llegar a una declaracin recursiva del mtodo del factorial,


observemos la siguiente relacin:
n! = n (n 1)!
Por ejemplo, es evidente que 5! es igual a 5 4!, como se muestra
mediante las siguientes ecuaciones:
5! = 5 4 3 2 1
5! = 5 (4 3 2 1)
5! = 5 (4!)
La evaluacin de 5! procedera como se muestra en la siguiente
figura, la cual muestra cmo procede la sucesin de llamadas
recursivas hasta que se evala 1! como 1, con lo cual termina la
recursividad. La figura tambin muestra los valores devueltos de cada
llamada recursiva al mtodo que hizo la llamada, hasta que el valor
se calcula y se devuelve.

Docente: Ing. MGQM

Contacto: mijailgmardl@gmail.com

Universidad Nacional Amaznica de Madre de Dios


Carrera Profesional de Ingeniera de Sistemas e Informtica

Anlisis y Diseo de Algoritmos

El Cdigo C# para el algoritmo anterior es :


//declaracin recursiva de la funcin factorial
public long factorial(long n)
{
//caso base
if (n == 1) return 1;
//paso de recursividad
else return n * (factorial(n - 1));
} //Fin de la funcin factorial
Calcular la suma de los n primeros enteros positivos
La funcin Suma implementada recursivamente requiere la definicin
previa de la suma de los primeros N enteros matemticamente en
forma recursiva, tal como se muestra a continuacin:
-

1 si N = 1
suma(N) = { N + suma(N1) en caso contrario

La definicin anterior significa que si N es 1, entonces la funcin


suma(N) toma el valor 1. En caso contrario, significa que la funcin
suma(N) toma el valor resultante de la suma de N y el resultado de
suma(N1). Por ejemplo, la funcin Suma(5) se evala tal como se
muestra en la siguiente figura:

Docente: Ing. MGQM

Contacto: mijailgmardl@gmail.com

Universidad Nacional Amaznica de Madre de Dios


Carrera Profesional de Ingeniera de Sistemas e Informtica

Anlisis y Diseo de Algoritmos

El cdigo C# para la funcin suma del algoritmo solicitado es:


public long suma(long n)
{
//caso base
if (n == 1) return 1;
//paso de recursividad
else return n + (suma(n - 1));
} //Fin de la funcin suma
Calcular el n-simo trmino en la sucesin de Fibonacci
Como ya se vio la sucesin de Fibonacci cumple para n mayor o igual
que 3 que cada trmino es igual a la suma de los dos anteriores. En
primer lugar hay que determinar la condicin de parada del algoritmo.
La sucesin define a sus dos primeros trminos con el valor 1, por lo
que la condicin de parada tiene que ser (n==1 || n==2). Esto
quiere decir que si el trmino es uno de los dos primeros el mtodo
devolver el valor 1, en caso contrario retornar la suma de
Fibonacci(n-1) + Fibonacci(n-2). A continuacin se muestra la
ejecucin de la funcin Fibonacci para el valor 4:

El Cdigo C# del algoritmo es:

Docente: Ing. MGQM

Contacto: mijailgmardl@gmail.com

Universidad Nacional Amaznica de Madre de Dios


Carrera Profesional de Ingeniera de Sistemas e Informtica

Anlisis y Diseo de Algoritmos


//declaracin recursiva de la funcin Fibonacci
public long Fibonacci(long n)
{
//caso base
if (n == 1 || n == 2) return 1;
//paso de recursividad
else return Fibonacci(n - 1) + Fibonacci(n - 2);
} //Fin de la funcin Fibonacci
El algoritmo de Euclides
Tal algoritmo representa un mtodo efectivo para encontrar el
mximo comn divisor entre dos nmeros enteros positivos. El
algoritmo consiste en varias divisiones euclidianas sucesivas. En la
primera divisin se toma como dividendo el mayor de los nmeros y
como divisor el otro, ahorrando as un paso. Luego el divisor y el resto
sirven, respectivamente, de dividendo y divisor de la siguiente
divisin. El proceso se detiene cuando se obtiene un resto nulo.

El mximo comn divisor de 124 y 6 es 2.

El mximo comn divisor de 18 y 45 es 9.


En consecuencia, la condicin base salida es que el resto sea cero.
Por tanto, sean los nmeros b1 y b2:
-

Si b2 es cero, la solucin es b1
Si b2 no es cero, la solucin es mcd(b2, b1 mod b2).

El cdigo C# para el algoritmo es:

Docente: Ing. MGQM

Contacto: mijailgmardl@gmail.com

Universidad Nacional Amaznica de Madre de Dios


Carrera Profesional de Ingeniera de Sistemas e Informtica

Anlisis y Diseo de Algoritmos


//declaracin recursiva de la funcion Euclides
public int Euclides(int x, int y)
{
//paso de recursividad
if (y != 0)
return Euclides(y, (x % y));
//caso base
else
return x;
} //Fin de la funcin Euclides
La funcin de Ackermann
La funcin de Ackermann, utilizada en la teora de la computacin, es
una funcin recursiva que toma dos nmeros naturales como
argumentos y devuelve un nmero natural. La frmula para la
definicin recursiva es la siguiente:

Dados A(m,n)
Entonces:
- n+1,
si m=0;
- A(m-1,1),
si m>0 y n=0;
- A(m-1, A(m,n-1)),
si m>0 y n>0;
La funcin crece rpidamente. Para darse una idea de la magnitud de
los valores que aparecen de la fila 4 en adelante, cuando m es igual a
4, se puede destacar que, por ejemplo, A(4,2) es mayor que el
nmero de partculas que forman el universo elevado a la potencia
200 y el resultado de A(5,2) no se puede escribir dado que no cabra
en el universo fsico. En general, por encima de la fila 4 ya no es
posible escribir todos los dgitos del resultado de la funcin.
La siguiente tabla muestra la complejidad de la funcin cuando los
valores se incrementan, el resultado de la funcin de Ackermann y el
nivel de profundidad que se alcanza cuando M y N toman ciertos
valores.

Docente: Ing. MGQM

Contacto: mijailgmardl@gmail.com

Universidad Nacional Amaznica de Madre de Dios


Carrera Profesional de Ingeniera de Sistemas e Informtica

Anlisis y Diseo de Algoritmos

//declaracin recursiva de la funcion Ackermann


public int Ackermann(int m, int n)
{
if (m == 0)
{ return n + 1; }
else
{
if (n == 0)
{
return Ackermann(m - 1, 1);
}
else
{
return Ackermann(m - 1, Ackermann(m, n - 1));
}
}
}
Trabajo Nro. 05:
1. Inversin de capital. Se ha depositado en una institucin
bancaria un monto de capital m por el cual se recibe un X% de
inters anual. El problema consiste en determinar el capital que
se tendr al cabo de n aos. Escriba un subprograma recursivo
que resuelva este problema. Recuerde que debe establecer los
estados base y recursivo del problema.
2. Escriba un subprograma recursivo que invierta el orden de los
elementos de un arreglo de N elementos. Es decir, que el
elemento que est en la posicin 0 se intercambie con el que
est en la posicin n-1, el de la posicin 1, con el de la n-2, y as
sucesivamente.
3. Escriba un subprograma recursivo que invierta el orden de una
cadena de caracteres. Por ejemplo, si la cadena de entrada es
ROMA, el resultado que debe arrojar el programa es AMOR.

Docente: Ing. MGQM

Contacto: mijailgmardl@gmail.com

Universidad Nacional Amaznica de Madre de Dios


Carrera Profesional de Ingeniera de Sistemas e Informtica

Anlisis y Diseo de Algoritmos


4. Se tienen tres arreglos: SUR, CENTRO y NORTE que almacenan
los nombres de los pases del Sur, Centro y Norte Amrica,
respectivamente. Los tres arreglos estn ordenados en forma
alfabtica. Escriba un subprograma recursivo que mezcle los
tres arreglos anteriores, formando un cuarto arreglo, AMRICA,
en el cual aparezcan los nombres de todos los pases del
continente ordenados alfabticamente.
5. Dado como dato el siguiente programa, sgalo y diga qu
imprime para los siguientes valores de X: X=38, X=51, X=24.

6. Escriba un subprograma recursivo que busque un valor X en un


arreglo unidimensional de enteros, ordenado en forma
decreciente.
7. Escriba un subprograma recursivo tal que dado como dato un
arreglo unidimensional de enteros positivos de dimensin N
(par), determine si las sumas de las dos mitades (del elemento
0 al (n/2)-1 y del elemento n/2 al n-1) son iguales.
8. Escriba un subprograma recursivo que quite todos los espacios
en blanco de una cadena de caracteres.
9. Dados como datos dos nmeros enteros positivos A y B, escriba
un programa recursivo que calcule AB.
10.
Escriba un subprograma recursivo que, dado como dato
un nmero entero positivo, regrese 1 si todos los dgitos de
dicho nmero son pares y 0 en otro caso.
11.
Escriba un subprograma recursivo que, dado como dato
un nmero entero positivo, regrese como resultado la suma de
sus divisores.
12.
Escriba un subprograma recursivo que invierta el orden de
los elementos de una pila. Puede utilizar cualquier estructura de
datos como auxiliar, si lo requiere.
Fecha de Entrega: martes 10 de noviembre de 2015 en clases
11:00 a.m. 11:15 a.m. Usar el formato de entrega de
siempre: documento Word + Nro. de trabajo + nombres +
apellidos.

Docente: Ing. MGQM

Contacto: mijailgmardl@gmail.com

Universidad Nacional Amaznica de Madre de Dios


Carrera Profesional de Ingeniera de Sistemas e Informtica

Anlisis y Diseo de Algoritmos

Se debe considerar:
- Nro. De problema.
- Formulacin del problema.
- Cdigo C# (Copiado del VS, a colores, solo reducir el
tamao)
-

que aparezca la
barra de ttulo donde se muestra
de dnde se ejecuta el programa.
Pantallazo

de

ejecucin,

Si algn trabajo no cumple lo mencionado, no se considerar


para su revisin.

Docente: Ing. MGQM

Contacto: mijailgmardl@gmail.com

Potrebbero piacerti anche