Está en la página 1de 4

Recursividad

El concepto de recursividad va ligado al de repeticin. Son recursivos aquellos


algoritmos que, estando encapsulados dentro de una funcin, son llamados desde ella
misma una y otra vez, en contraposicin a los algoritmos iterativos, que hacen uso de
bucles while, do-while, for, etc.

Algo es recursivo si se define en trminos de s mismo (cuando para definirse hace


mencin a s mismo). Para que una definicin recursiva sea vlida, la referencia a s
misma debe ser relativamente ms sencilla que el caso considerado.

Ejemplo: definicin de n natural:

- el N 0 es natural
- El N n es natural si n-1 lo es.

Un mtodo recursivo es un mtodo que se llama a si mismo, directa o indirectamente.


Es una alternativa a la iteracin o repeticin. En cuanto a tiempo de computadora y uso
de memoria es menos eficiente, es una herramienta til para solucionar problemas de
naturaleza recursiva.

Naturaleza de la recursividad
Un objeto es recursivo si figura en su propia definicin
Ej:
1 para N = 0
1) N! =
N(N-1)! para N > 0

1 si N = N = 1
2) fibonacci(N) =
fibonacci(N-1)+ fibonacci(N-2) si N > 1

Caracterstica de la recursividad
Siempre existe una forma de salir de la definicin.

En un algoritmo recursivo distinguimos como mnimo 2 partes:

a). Caso trivial, base o de fin de recursin:

Una condicin de salida que es la condicin que no produce otra autollamada. Es un


caso donde el problema puede resolverse sin tener que hacer uso de una nueva llamada
a s mismo. Evita la continuacin indefinida de las partes recursivas.

b). Parte puramente recursiva:

Una llamada a s mismo (recursiva); normalmente con el valor de los parmetros que
cambian en cada llamada. Relaciona el resultado del algoritmo con resultados de casos
ms simples. Se hacen nuevas llamadas a la funcin, pero estn ms prximas al caso
base.

EJEMPLO

ITERATIVO:
int factorial( int n )
{
int res=1;
for(int i=1; i<=n; i++ )
res = res*i;
return(res);
}

RECURSIVO:
int factorial( int n )
{
if(n==0) return(1);
return(n*Factorial(n-1));
}

TIPOS DE RECURSIN

Recursividad directa

Recursividad simple: Aquella en cuya definicin slo aparece una llamada


recursiva. Se puede transformar con facilidad en algoritmos iterativos.
Recursividad mltiple: Se da cuando hay ms de una llamada a s misma
dentro del cuerpo de la funcin, resultando ms difcil de hacer de forma
iterativa.

int fib( int n ) /* ej: Fibonacci */


{
if(n <= 1) return 1;
return(fib(n-1) + fib(n-2));
}

Recursividad anidada: En algunos de los argumentos de la llamada recursiva


hay una nueva llamada a s misma.

int ack( int n, int m ) /* ej: Ackerman */


{
if(n==0 ) return(m+1);
else if(m==0) return(ack(n-1,1));
return(ack(n-1, ack(n,m-1)));
}
Recursividad cruzada o indirecta: Son algoritmos donde una funcin provoca una
llamada a s misma de forma indirecta, a travs de otras funciones.

Ej: Par o Impar:


int par( int nump )
{
if(nump==0) return(1);
return( impar(nump-1));
}

int impar( int numi )


{
if(numi==0) return(0);
return( par(numi-1));
}

LA PILA DE RECURSIN

La memoria del ordenador se divide (de manera lgica, no fsica) en varios segmentos
(4):

Segmento de cdigo: Parte de la memoria donde se guardan las instrucciones del


programa en cdigo de mquina.
Segmento de datos: Parte de la memoria destinada a almacenar las variables estticas.
Montculo: Parte de la memoria destinada a las variables dinmicas.
Pila del programa: Parte destinada a las variables locales y parmetros de la funcin
que est siendo ejecutada.

Llamada a una funcin:

Se reserva espacio en la pila para los parmetros de la funcin y sus variables


locales.
Se guarda en la pila la direccin de la lnea de cdigo desde donde se ha llamado
a la funcin.
Se almacenan los parmetros de la funcin y sus valores en la pila.
Al terminar la funcin, se libera la memoria asignada en la pila y se vuelve a la
instruccin actual.

Llamada a una funcin recursiva:

En el caso recursivo, cada llamada genera un nuevo ejemplar de la funcin con sus
correspondientes objetos locales:

La funcin se ejecutar normalmente hasta la llamada a s misma. En ese


momento se crean en la pila nuevos parmetros y variables locales.
El nuevo ejemplar de funcin comienza a ejecutarse.
Se crean ms copias hasta llegar a los casos bases, donde se resuelve
directamente el valor, y se va saliendo liberando memoria hasta llegar a la
primera llamada (ltima en cerrarse)
Medicin de la eficacia de un algoritmo recursivo
Viene dada por:
1. Tiempo de ejecucin
2. Espacio de memoria ocupado por el algoritmo
3. Legibilidad y facilidad de comprensin

EJERCICIOS

a). Torres de Hanoi: Problema de solucin recursiva, consiste en mover todos los
discos (de diferentes tamaos) de una aguja a otra, usando una aguja auxiliar, y
sabiendo que un disco no puede estar sobre otro menor que ste.
_|_ | |
[___] | |
[_____] | |
[ ] | |
-------------------------------------
A B C

/* Solucion:
1- Mover n-1 discos de A a B
2- Mover 1 disco de A a C
3- Mover n-1 discos de B a C
*/
void Hanoi( n, inicial, aux, final )
{
if( n>0 )
{
Hanoi(n-1, inicial, final, aux );
printf("Mover %d de %c a %c", n, inicial, final );
Hanoi(n-1, aux, inicial, final );
}
}

b). Calcular x elevado a n de forma recursiva:

float xelevn( float base, int exp )


{
if(exp == 0 ) return(1);
return( base*xelevn(base,exp-1));
}

c). Multiplicar 2 ns con sumas sucesivas recurs:

int multi( int a, int b )


{
if(b == 0 ) return(0);
return( a + multi(a, b-1));
}

Referencia:

http://www.cursopolis.com/visitarenlace.php?lid=135

También podría gustarte