Vous êtes sur la page 1sur 19

Recursividad

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.

La recursin o recursividad es un concepto amplio, Aparece en numerosas actividades de la


vida diaria; por ejemplo, en una fotografa donde se observa otra fotografa.
Otro caso ilustrativo es el que se presenta en los programas de televisin, en el que un periodista
transfiere el control de la noticia a otro periodista que se encuentra en otra ciudad, y ste, a su vez,
hace lo mismo con un tercero. Cuando ste ltimo termina su participacin regresa el control al
segundo, y cuando ste tambin finaliza su intervencin regresa el control al primero.

Nota: aunque los trminos "recursin" y "recursividad" son ampliamente


empleados en el campo de la informtica, el trmino correcto en castellano es
recurrencia]. Sin embargo este ltimo trmino es algo ms especfico.
Recursividad:
Un objeto se dice que es recursivo si el mismo forma parte de su definicin.

Ejemplo: de objetos recursivos:


Una locomotora es un tren
Un tren es un vagn enganchado a un tren

En literatura a la recursividad se le conoce como empotramiento


Alguna vez tuviste un sueo, en el que soabas que estabas soando y en este
que estabas soando y en ......, en literatura le llaman "empotrados" a lo
"recursivo", no es solamente un recurso de la informtica, es ms bien de muchas
reas del conocimiento
Tipos de recursividad:
La recursin se puede presentar de dos maneras diferentes: // recursin directa
Public static int factorial (int n)
Directa: El mtodo contiene al menos una llamada a si mismo. {
if (n<=1) return 1;
else retrun n*factorial(n-1);
}
Indirecta. Existe una secuencia de llamadas a mtodos donde al menos una de estas llega al mtodo
inicial. // recursin indirecta
Public static int que(int n) {
if (n<=1) return n;
else
if ( n mod 2 == 0) return magia((int))n/2);
else return 1 + magia(n*3+1);
}
Public static int magia(int n){
if (n==1) return 1;
else
if ((n mod 2==1) return que(n-1);
else return que ((int)n/2);
}
Representacin: recursin directa:
Ejemplo: P representa un programa y en alguna parte de l aparece una llamada a s mismo.

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 .

El factorial de un nmero entero positivo de n se define como el producto de los


nmeros comprendidos entre 1 y n. Tambin como n por el factorial de (n-1), as
aparece el concepto de recursin. La expresin n! simboliza factorial de n.
Ejemplo
0! = 1 -> Paso bsico
1! = 1 -> Paso bsico
2! = 2 * 1! = 2*1
3! = 3 * 2! = 3*2*1
4! = 4 * 3!= 4*3*2*1
.
.
N!=n*(n-1)!=n*(n-1)**4*3*2*1 ------Paso recursivo
Ejemplo:
Para calcular, por ejemplo el factorial de el nmero 4, decimos que 4! Es igual a 4*3!. Al factorial de 3,
lo calculamos como 3*2!. Al factorial de 2, como 2*1! , y as sucesivamente hasta llegar a un paso
bsico que detiene la recursividad. Llegamos a definir entonces, que el factorial de un nmero n en
trminos del factorial del nmero (n-1).
1 si n= 0 o n =1 Paso bsico

n!

n*(n-1)! Si n>1 Paso recursivo


Algoritmo recursivo clculo factorial.
ejemplo: Factorial_rec(n).

\\ Este algoritmo calcula el factorial de un nmero N en forma recursiva, donde N es un valor


numrico entero, positivo o nulo

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

// aplicado estructura iteracin

Escribir 'calculo de factoriales'

Escribir ' Digita un numero '

Leer n

factorial <- 1

Para i<-1 Hasta n Hacer

factorial <- factorial*i

FinPara

Escribir 'el factorial de ',n,' es: ',factorial

FinAlgoritmo
Ejemplo pseudocodigo factorial recursivo (diagramas )
Algoritmo factorial

definir n como Entero;

Escribir "base factorial :";

leer n;

Escribir "Factorial de ",n, "es : ", facto(n);

FinAlgoritmo

SubAlgoritmo res<- facto(n)


definir res como entero;
si (n== 0) entonces
res<-1;
SiNo
res<-facto(n-1)*n;

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>

// calculo sucesion nmeros fibonacci


int main() int fibonacci(int n){
{ if (n>2)
int i=1; return fibonacci(n-1) + fibonacci(n-2);
int x=0; else if (n==2)
int y=1; return 1;
int z; else if (n==1)
printf("0\n1\n",z); return 1;
else if (n==0)
for (i=1;i<=20;i++) return 0;
{ }
z=x+y; int main(void)
printf("%d\n",z); {
x=y; int num;
y=z; for (num=0; num<=20; num++)
} {
printf("%d\n", fibonacci(num));
system("pause"); }
return 0; system("PAUSE");
} return 0;

Vous aimerez peut-être aussi