Académique Documents
Professionnel Documents
Culture Documents
Definicin:
Se llama recursividad a un proceso mediante el que una funcin se llama a s misma de forma
repetida, hasta que se satisface alguna determinada condicin. El proceso se utiliza para
computaciones repetidas en las que cada accin se determina mediante un resultado anterior.
Subprograma P
- ------
--------
-------
Llamada a P
Recursin indirecta:
El subprograma llama a otro programa, y ste, en algn momento, llama nuevamente al primero.
El subprograma P llama al subprograma Q, y ste, a su vez, invoca al primero: es decir regresa el control a P.
Subprograma P Subprograma Q
----------- -----------
----------- -----------
----------- -----------
Llamada a Q Llamada a P
En toda definicin recursiva de un problema siempre se deben establecer dos pasos diferentes
que son muy importantes: El paso bsico y el paso recursivo.
El primero, uno o varios, dependiendo del problema, se emplea como una condicin de parada o fin de
la recursividad. A ste llegamos cuando encontramos la solucin del problema o cuando decidimos que
ya no vamos a seguir, porque no estn dadas las condiciones para hacerlo.
El segundo, por otra parte , propicia la recursividad. Se pueden presentar uno o varios nuevamente
dependiendo del problema a resolver
Clculo Factorial.
Factorial: Se desea calcular n! (el factorial de n , que se define como el producto de
todos los enteros positivos de 1 a n ). Se puede definir el problema de forma
recurrente como n(n-1)! ; como (n-1)! es menor que n! podemos aplicar
induccin por lo que disponemos del resultado. El caso base es 0! que es 1 .
n!
1.- Si(n==0)
entonces
Hacer factorial<-rec -1 \\ (paso bsico)
sino
Hacer factorial-rec<- Factorial-rec(n-1)
\\ Lllamdo paso recursividad
\\ fin del condicional del paso 1
Ejemplo 1: Factorial
El factorial de un entero no negativo, escrito n! y pronunciado factorial de n, es el producto:
n.(n-1).(n-2)....1
con 1!=1 y 0!=1.
El factorial de un entero numero mayor o igual a 0 puede ser calculado en forma iterativa utilizando for como sigue:
factorial=1; for (cont=numero;cont >= 1;cont - - ) factorial *= cont;
Una denicion recursiva de la funcion factorial se obtiene al observar la siguiente relacion:
n!=n.(n-1)!
la denicion de la funcion recursiva correspondiente a factorial es:
1
long factorial(int numero) { if (numero <= 1) return 1; else return (numero * factorial(numero-1)); }
utilizamos variables de tipo long porque la funcion factorial crece rapido.
Diagramas de flujo y NS Factorial
Pseudocodigo factorial
Algoritmo fact
// calculo de factorial
Leer n
factorial <- 1
FinPara
FinAlgoritmo
Ejemplo pseudocodigo factorial recursivo (diagramas )
Algoritmo factorial
leer n;
FinAlgoritmo
FinSi
FinSubAlgoritmo
Codigo correspondiente a c, factorial-rec
#include <stdio.h>
#include <stdlib.h>
// calculo factorial
int factorial(int n){
int x;
if (n==0)
{
return 1;
}
x= n * factorial(n - 1);
return(x);
}
int main() {
int fact,n;
printf("\n\t ingresa un numero");
scanf("%d",&n);
fact=factorial(n);
printf("\n\t el factorial es %d ",fact);
}
Fibonacci
La serie de Fibonacci:
0,1,1,2,3,5,8,13,21,...
empieza con 0 y 1 y tiene la propiedad que cada nmero subsecuente es la suma de los dos
nmeros previos. Puede ser denida en forma recursiva por:
bonacci(0)=0 bonacci(1)=1 bonacci(n)=bonacci(n-1)+bonacci(n-2)
el programa respectivo es:
long bonacci (int n) { if (n==0 || n==1) return n; else return bonacci(n-1)+bonacci(n-2); }
Cada vez que se invoca a bonacci se prueba el caso base, es decir si n es 0 o 1. Si esto es
verdadero se regresa n. Si n es mayor que 1 el paso de recursin genera dos llamadas recursivas
cada una de las cuales es para un problema ligeramente ms sencillo que el original (valores de
n menores).
Sucesin de Fibonacci.
Un problema clsico de recursividad el del clculo de la secesin de Leonardo de Pisa, conocido
como Fibonacci:
0,1,1,2,3,5,8,13,21,34., etc.
Empieza con 0 y 1 y tiene la propiedad que cada nmero subsecuente es la suma de los dos nmeros
previos. Puede ser denida en forma recursiva por:
bonacci(0)=0 bonacci(1)=1 bonacci(n)=bonacci(n-1)+bonacci(n-2)
el programa respectivo es:
long bonacci (int n) { if (n==0 || n==1) return n; else return bonacci(n-1)+bonacci(n-2); }
Cada vez que se invoca a bonacci se prueba el caso base, es decir si n es 0 o 1. Si esto es verdadero
se regresa n. Si n es mayor que 1 el paso de recursin genera dos llamadas recursivas cada una de las
cuales es para un problema ligeramente ms sencillo que el original (valores de n menores).
Ejemplos solucin en c, versin iteracin vs recursivo
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>