Académique Documents
Professionnel Documents
Culture Documents
Unidad 2. Recursividad
2.1. Definicin
Esta tcnica es muy utilizada para resolver problemas complejos que no pueden ser resueltos tan
fcilmente con estructuras de repeticin.
La recursividad a simple vista parece un ciclo interminable, sin embargo, la clave para evitar esto, es
que en la definicin del problema exista un caso base, esto es, una solucin directa.
En una funcin pueden existir varias llamadas de tipo recursivo, pero de cualquier manera lo que
hace efectiva la recursin, son estas dos caractersticas: cambio en los valores de los parmetros
de la llamada recursiva y una solucin directa al problema.
A diferencia de una estructura iterativa, la cual establece una condicin para efectuarse el ciclo, en
la funcin recursiva, se establece una condicin para la llamada recursiva y no existe como tal una
estructura de repeticin, pero si se lleva a cabo un ciclo para solucionar el problema.
Para entender cmo funciona la recursin, veamos a continuacin un caso clsico que ilustra tanto
una solucin recursiva como una solucin iterativa
n! = 1;
Para n>0
Ejemplos:
5! = 5 * 4 * 3 * 2 * 1 = 120
0! = 1
7! = 7 * 6 * 5 * 4 * 3 * 2 * 1 = 5040
esta definicin es lineal y explcita, y nos lleva a pensar en un ciclo para solucionar el factorial de un
nmero n. Solucin iterativa.
Para n=0
n! = 1;
Para n>0
n! =n * (n-1)!
Ejemplos:
5! = 5 * 4!
0! = 1
7! = 7 * 6!
esta definicin es recursiva, y para solucionar el factorial de n, debe resolverse primero el factorial
de n-1, esto es;
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 1
Esto nos conduce a un ciclo, hasta llegar a una solucin directa cuando por definicin el factorial 0!
es igual a 1 y una vez resuelto este caso base es posible solucionar en regresin los valores
factoriales pendientes, como se muestra a continuacin:
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 1
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0! = 1*1= 1
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1! = 2 * 1= 2
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2! = 3 * 2 = 6
5! = 5 * 4!
4! = 4 * 3! = 4 * 6 = 24
5! = 5 * 4! = 5 *24 = 120
int factorial_iterativo(int n)
{
int res=1;
if (n==0)
return 1;
else
{
for ( int x=n, x>1;x--)
res*=x;
return res;
}
}
f = factorial_recursivo(5);
if (n==0) // FALSO
return 1;
else
return (5*factorial_recursivo (4)); //LLAMADA RECURSIVA
------------------------------------------------------------------------------------------
para la llamada factorial_recursivo(4)
n=4
if (n==0) // FALSO
return 1;
else
return (4*factorial_recursivo (3)); //LLAMADA RECURSIVA
-----------------------------------------------------------------------------------------------
if (n==0) // FALSO
return 1;
else
return (3*factorial_recursivo (2)); //LLAMADA RECURSIVA
------------------------------------------------------------------------------------------------
para la llamada factorial_recursivo(2)
n=2
if (n==0) // FALSO
return 1;
else
return (2*factorial_recursivo (1)); // LLAMADA RECURSIVA
-------------------------------------------------------------------------------------------------
para la llamada factorial_recursivo(1)
n=1
if (n==0) // FALSO
return 1;
else
return (1*factorial_recursivo (0)); //LLAMADA RECURSIVA
--------------------------------------------------------------------------------------------------
para la llamada factorial_recursivo(0)
n=0
if (n==0) // VERDADERO
return 1; // SE RETORNA EL VALOR 1, DONDE FUE INVOCADO
-----------------------------------------------------------------------------------
para la llamada factorial_recursivo(2)
n=2
return (2*1);
// Se realiza la operacin con el valor
// recibido 1
// y RETORNA EL RESULTADO VALOR 2
_______________________________________________________
------------------------------------------------------------------------------------------
f = 120
Serie Fibonacci
0 1 1 2 3 5 8 13 21 34
Si deseamos disear un mtodo para calcular el valor que corresponde a cierto nmero de la serie,
podramos definir el problema de la siguiente manera:
Fibonacci (n)
Para n>2
Es decir, el nmero n de la serie, es la suma de los dos nmeros Fibonacci anteriores a n, es decir,
Fibonacci (n-2) y Fibonacci (n-1)
Para poder determinar cul es el valor del elemento 5 de la serie, se debe conocer cules son los
elementos 3 y 4 de la serie, lo que nos lleva a tener que resolver primero esta incgnita para dar
solucin a la primera.
El diseo de mtodos recursivos, puede parecer difcil en un principio, pero con la prctica, el
programador puede volverse un experto y utilizar esta poderosa herramienta de programacin.
Ahora bien, por otro lado, tambin es importante considerar el diseo interno del lenguaje de
programacin que permite la recursin, ya que deben considerarse los controles necesarios en las
llamadas a las funciones y la manipulacin de memoria para el almacenamiento de variables y sus
valores. Una parte fundamental, en el diseo del lenguaje de programacin es, la utilizacin de las
estructuras de datos, para lograr la recursin, se utilizan las pilas, que son ideales ya que por su
caracterstica de acceso a los datos en orden inverso al que se almacenaron, permite hacer el
regreso a los llamados de funciones que se establecen en la recursin.