Académique Documents
Professionnel Documents
Culture Documents
1
n! =
n(n 1)!
si n = 0
si n > 0
ELEMENTOS
En toda definicin recursiva se observa dos partes diferenciadas:
Estado bsico (BASE).- estado en el cual la solucin no se presenta de
manera recursiva.
Estado recursivo.- en donde la solucin se presenta en forma recursiva.
Generalmente el estado recursivo va disminuyendo en cada llamada hasta
llegar al estado base.
129
Fundamentos de Programacin
Ventajas: No es necesario definir la secuencia de pasos exacta para resolver el problema. Podemos considerar que tenemos resuelto el problema
(de menor tamao).
Desventajas: Tenemos que encontrar una solucin recursiva, y, adems,
podra ser menos eficiente.
9.2 DISEO DE PROGRAMAS RECURSIVOS
Para resolver un problema, el primer paso sera la identificacin de un algoritmo recursivo, es decir, descomponer el problema en subproblemas
de menor tamao (aunque de la misma naturaleza del problema original) y
componer la solucin final a partir de las subsoluciones obtenidas.
Tendremos que disear: casos base, casos recursivos y la solucin en trminos de ellos.
Siempre debe existir al menos un caso base El nmero y forma de los casos
base son hasta cierto punto arbitrarios. La solucin ser mejor cuanto ms
simple y eficiente resulte el conjunto de casos seleccionados.
Los casos recursivos siempre deben avanzar hacia un caso base. Es decir,
la llamada recursiva se hace a un subproblema ms pequeo y, en ltima
instancia, los casos generales alcanzarn un caso base.
Por ejemplo el clculo del factorial de 3 sera:
1
3! = 3 x 2!
3! = 6
3! = 3 x 2!
2! = 2 x 1!
3! = 3 x 2 = 6
3! = 3 x 2!
2! = 2 x 1!
1! = 1x0!
3! = 3 x 2!
2! = 2 x 1 = 2
3! = 3 x 2!
2! = 2 x 1!
1! = 1x0!
0!=1
3! = 3 x 2!
2! = 2 x 1!
1! = 1 x 1= 1
9: Recursividad
llamada recursiva genera una nueva zona de memoria en la pila independiente del resto de llamadas.
Ejemplo: Ejecucin del factorial con n=3.
1. Dentro de factorial, cada llamada
return (n*factorial(n-1));
genera una nueva zona de memoria en la pila, siendo n-1 el correspondiente
parmetro actual para esta zona de memoria y queda pendiente la evaluacin de la expresin y la ejecucin del return.
2. El proceso anterior se repite hasta que la condicin del caso base se hace
cierta.
Se ejecuta la sentencia return (1); Empieza la vuelta atrs de la recursin, se
evalan las expresiones y se ejecutan los return que estaban pendientes.
Por ejemplo: El cdigo recursivo del factorial de un nmero se obtiene de su
definicin matemtica:
1
n! =
n(n 1)!
si n = 0
si n > 0
Fundamentos de Programacin
9.4 EJERCICIOS DE PROGRAMACIN RESUELTOS
1 Programa que halla la potencia de un nmero en forma recursiva, considerando la base y el exponente como datos de entrada.
Realizando el anlisis de los datos se tendra en forma matemtica la ecuacin:
si b 0
1
potencia (a, b) =
a * potencia (a, b 1) si b > 0
pot(3,2) = 3 x pot(3,1)
pot(3,2) = 9
pot(3,2) = 3 x pot(3,1)
pot(3,1) = 3 x pot(3,0)
pot(3,2) = 3 x 3 = 9
pot(3,2) = 3 x pot(3,1)
pot(3,1) = 3 x pot(3,0)
pot(3,0) = 1
pot(3,2) = 3 x pot(3,1)
pot(3,1) = 3 x 1 = 3
El programa es el siguiente:
#include <iostream>
long potencia(int a, int b);
using namespace std;
int main(int argc, char *argv[])
{
int a, b;
cout<<Introduce numero: ; cin>>a;
cout<<Introduce potencia: ; cin>>b;
cout<<El resultado es: <<potencia(a,b)<<endl;
system(PAUSE);
return EXIT_SUCCESS;
}
long potencia(int a, int b)
{
if (b<=0)
return 1;
else
return a*potencia(a,b-1);
}
132
9: Recursividad
Fundamentos de Programacin
int fibonacci (int n)
{
if ((n == 0) || (n == 1))
return (1);
else
return (fibonacci(n-1) + fibonacci(n-2));
}
9: Recursividad
int main(int argc, char *argv[])
{
int n; // Numero de discos a mover
cout << Ingrese el numero de discos: ;
cin >> n;
hanoi (n, 1, 2, 3); // mover n discos del 1 al 3,
// usando el 2 como temporal.
system(PAUSE);
return EXIT_SUCCESS;
}
void hanoi (int n, int inic, int tmp, int final)
{
if (n > 0) {
// Mover n-1 discos de inic a tmp.
// El temporal es final.
hanoi (n-1, inic, final, tmp);
// Mover el que queda en inica final
cout <<Del poste <<inic<< al <<final<<\n;
// Mover n-1 discos de tmp a final.
// El temporal es inic.
hanoi (n-1, tmp, inic, final);
}
}
135