Вы находитесь на странице: 1из 4

Funcin Recursiva

Explica:
Qu es una funcin recursiva?

Se dice que una funcin es recursiva cuando algo est definido en trminos de
una versin ms pequea de s mismo .
No todas las funciones pueden llamarse a s mismas, sino que deben estar
diseadas especialmente para que sean recursivas, de otro modo podran
conducir a bucles infinitos, o a que el programa termine inadecuadamente.
Tampoco todos los lenguajes de programacin per miten usar recursividad.
C++ permite la recursividad.
Cada vez que se llama a una funcin, se crea un juego de variables locales, de
este modo, si la funcin hace una llamada a s misma, se guardan sus variables y
parmetros, usando la pila, y la nueva i nstancia de la funcin trabajar con su
propia copia de las variables locales.
Cuando esta segunda instancia de la funcin retorna, recupera las variables y los
parmetros de la pila y contina la ejecucin en el punto en que haba sido
llamada.
La recursividad consume muchos recursos de memoria y tiempo de ejecucin, y se
debe aplicar a funciones que realmente le sean tiles.

Qu es un caso base?
Es el caso para el cual la solucin se puede declarar en forma no recursiva.
Normalmente, corresponde a instancias del problema simples y fciles de
implementar, para los cuales es innecesario expresar la solucin en trminos de
un sub problema de la misma naturaleza, es decir, de forma recursiva.
Es recomendable poner varios casos, para asegurarse que el conjunto es
suficientemente amplio como para asegurar el fin de la recursin.

Define la estructura de una funcin recursiva.


1. Entender el problema.
2. Determinar el (los) caso(s) base.
3. Determinar el (los) caso(s) recursivo(s).
Ejemplo:
Clculo de un factorial.
El factorial de un nmero N (N!) es multiplicado por N -1, N-2, N-3, etc.
(
)
Otra forma de expresarlo es:
Esta expresin se ve como una definicin recursiva. (
menor de N!, o sea que se necesita una multiplicacin

) es una instancia
menos para calcular

(
) que para calcular N!. Si podemos enco ntrar un caso base, se podr escribir
un algoritmo recursivo.
Para este caso: 0! Est definido en la matemtica como 1.

Factorial (entrada:n)
If n es 0
Devolver 1
ELSE
Devolver n*Factorial(n-1)

Entonces se codificar como: int factorial (/*in*/ int n)


//precondicin :
// n>=0
//pos condicin:
//
valor de la funcin ==n!
// Nota:
// Los valores grandes de n pueden causar desbordamientos de enteros

{
if (n == 0)
return 1;
//caso base
else
return n*Factorial(n-1); //caso general
Trazando la funcin con un n original de 4.
Llamada 1:
n es 4. Puesto que n no es 0, la bifurcacin else esta ocupada. La
declaracin return no puede ser completada hasta que la llamada recursiva
a Factorial con n-1 como argumento ha sido completada.
Llamada 2:
n es 3. La declaracin return no puede ser completada hasta que la llamada
recursiva a Factorial con n-1 como argumento ha sido completada.
Llamada 3:
n es 2. La declaracin return no puede ser completada hasta que la llamada
recursiva a Factorial con n-1 como argumento ha sido completada.
Llamada 4:
n es 1. La declaracin return no puede ser completada hasta que la llamada
recursiva a Factorial con n-1 como argumento ha sido completada.
Llamada 5:

n es 0. Puesto que n es igual a 0, esta llama a la funcin regresa,


devolviendo 1 como resultado.
Llamada 4:
La declaracin return en esta copia puede ahora ser completada. El valor a
ser devuelto es n (que es 1) por 1. Esta llamada a la funcin regresa,
devolviendo 1 como resultado.
Llamada 3:
La declaracin return en esta copia puede ahora ser completada. El valor a
ser devuelto es n (que es 2) por 1. Esta llamada a la funcin regresa,
devolviendo 2 como resultado.
Llamada 2:
La declaracin return en esta copia puede ahora ser completada. El valor a
ser devuelto es n (que es 3) por 2. Esta llamada a la funcin regresa,
devolviendo 6 como resultado.
Llamada 1:
La declaracin return en esta copia puede ahora ser completada. El valor a
ser devuelto es n (que es 4) por 6. Esta llamada a la funcin regresa,
devolviendo 24 como resultado.
Puesto que esta es la ltima de las llamadas a factorial, el proceso recursivo ha terminado.
El valor 24 es devuelto como valor final de la llamada a factorial con un argumento de 4.
La figura 5.1 resume la ejecucin de la funcin factorial con un argumento de 4.

Solucin iterativa:
int Factorial (/*in */ int n)
{
int factor;
int count;
factor =1;
for (count = 2; count <=n; count++)
factor = factor * count;
return factor;
}

Solucin recursiva
int Factorial ( /* in */ int n)
{
if (n ==0)
return 1;
else
return n* Factorial(n-1);
}
La versin iterativa tiene dos variables locales, mientras que la versin recursiva
no tiene ninguna.

Вам также может понравиться