1. EQUIPO Nº 4
RECURSIVIDAD
ALVARADO ROSA
NELFALY MEDINA
BETZY RODRIGUEZ
VASQUEZ ALBA
RIVAS MIRIAM
RIOS LUIS
Prof. Ing. Zamantha González. PNFSI. Cojedes.
2. Es una Técnica que permite que una función se
llame a si misma.
El concepto de Recursividad va ligado a la
repetición.
Son Recursivos aquellos algoritmos que,
estando encapsulados dentro de una función,
son llamados desde ella misma una y otra vez,
en contraposición a los algoritmos iterativos
que hacen uso de bucles while, do-while, for,
etc.
CONCEPTO
3. CONCEPTO
Para que una función recursiva sea válida, la
referencia a sí misma debe ser relativamente más
sencilla que el caso considerado.
En un algoritmo recursivo distinguimos como
mínimo 2 partes:
a). Caso trivial, base o fin de recursión:
Es un caso donde el problema puede resolverse sin
tener que hacer uso de una nueva llamada a sí
mismo. Evita la continuación indefinida de las partes
recursivas.
b). Parte puramente recursiva:
Relaciona el resultado del algoritmo con resultados
de casos mas simples. Se hacen nuevas llamadas a
la función, pero están más próximas al caso base.
4. CONCEPTO
Ejemplos:
ITERATIVO:
Int Factorial (int n )
{
Int ¡, res = 1;
For(¡=1;¡<=n;¡++ )
res = res*¡;
return (res);
}
RECURSIVO:
Int Factorial (int n )
{
If (n==0) return (1);
Return (n*Factorial (n-1));
}
5. UTILIDAD DE LA RECURSIVIDAD
Se utiliza para realizar una llamada a una
función desde la misma función.
Hemos visto que la recursión es una técnica
potente de programación para resolver,
mediante soluciones simples y claras,
problemas de gran complejidad.
6. La sobrecarga asociada con las llamadas a
subalgoritmos:
Este factor es propio de los subalgoritmos en
general, aunque es mayor con la recursividad ,
ya que una simple llamada inicial a un
subalgoritmo puede generar un gran número de
llamadas recursivas .
Podemos fácilmente escribir una función
iterativa Factorial tan clara como la recursiva y
sin la sobre carga de ésta.
UTILIDAD DE LA RECURSIVIDAD
7. UTILIDAD DE LA RECURSIVIDAD
Ej: de Factorial en algoritmo:
N es 3
FACTORIAL 3* FACTORIAL (2)
Retorno
N es 2
FACTORIAL 2* FACTORIAL (1)
Retorno
N es 1
FACTORIAL 1* FACTORIAL (0)
Retorno
N es 0
FACTORIAL 1
Retorno
FACT FACTORIAL (3)
8. TIPOS DE RECURSIVIDAD
Recursividad Simple: Aquella en cuya definición
sólo aparece una llamada recursiva. Se puede
transformar con facilidad en algoritmos
iterativos.
Recursividad Múltiple: Se da cuando hay más de
una llamada a sí misma dentro del cuerpo de la
función, resultando más difícil de hacer de
forma iterativa.
int Fib( int n ) /* ej: Fibonacci */
{
if(n<=1) return(1);
return(Fib(n-1) + Fib(n-2));
}
9. TIPOS DE RECURSIVIDAD
Recursividad Anidada: En algunos de los
argumentos de la llamada recursiva hay una
nueva llamada a sí misma.
int Ack( int n, int m ) /* ej: Ackerman */
{
if(n==0 ) return(m+1);
else if(m==0) return(Ack(n-1,1));
return(Ack(n-1, Ack(n,m-1)));
}
10. TIPOS DE RECURSIVIDAD
Recursividad cruzada o indirecta: Son algoritmos
donde una función provoca una llamada a sí
misma de forma indirecta, a través de otras
funciones.
Ej: Par o Impar:
int par( int nump )
{
if(nump==0) return(1);
return( impar(nump-1));
}
int impar( int numi )
{
if(numi==0) return(0);
return( par(numi-1));
}
11. ALGORITMO: DIVIDE Y VENCERAS
Una de las técnicas más importantes para el diseño de
algoritmos típicos en la Recursividad es la técnica
llamada:”Divide y Vencerás”. Esta técnica consiste en
transformar un problema de tamaño n en problemas más
pequeños, de tamaño menor que n.
El algoritmo de búsqueda binario es un ejemplo típico de
esta técnica algorítmica. La lista ordenada de los elementos
se divide en dos mitades de forma de que el problema de
búsqueda de un elemento se reduce al problema de
búsqueda en una mitad; así se prosigue dividiendo el
problema hasta encontrar el elemento, o bien decir que no se
encuentra.
Un algoritmo “Divide y Vencerás”, puede ser definido de
manera recursiva, de tal modo que se llama así mismo
aplicándose cada vez a un conjunto menor de elementos.
ALGORITMO TIPICO
12. ALGORITMO TIPICO
TORRE DE HANOI: Problema de solución
recursiva, consiste en mover todos los discos
(de diferentes tamaños) de una aguja a otra,
Usando una aguja auxiliar, y sabiendo que un
disco no puede estar sobre otro menor que
éste.
14. ALGORITMO TIPICO
/* Solución :
1- Mover n-1 discos de A a B
2- Mover 1 discos de A a C
3- Mover n-1 discos de B a C
*/
Void Hanoi(n,inicial,aux,final)
{
if( n>0)
{
Hanoi (n-1,inicial,final,aux);
printf (“Mover % d de % c”, n,inicial,final);
Hanoi (aux, inicial,final);
}
}
15. ALGORITMO TIPICO
Ordenación por inserción
Se trata de ordenar un vector formado por n
enteros. Para esto el algoritmo de inserción
va intercambiando elementos del array
hasta que esté ordenado.
16. ALGORITMO TIPICO
void insercion (int a[])
{
int i, j, x;
for (i=1; i
x = a[i];
j = i - 1;
while ((j>-1) && (a[j]>x)) {
a[j+1] = a[j];
j = j - 1;
}
a[j+1] = x;
}
}
17. ALGORITMO TIPICO
Ordenación por selección
Se trata de ordenar un vector formado por n
enteros. Para esto el algoritmo de selección
va seleccionando los elementos menores al
actual y los intercambia.
18. ALGORITMO TIPICO
void seleccion (int a[])
{
int i, j;
int minx, minj;
for (i=0; i < n-1; i++) {
minj = i;
minx = a[i];
for (j = i; j < n; j++) {
if (a[j] < minx) {
minj = j;
minx = a[j];
}
}
a[minj] = a[i];
a[i] = minx;
}
}
19. Satisface dos interrogantes
1.- ¿Cómo se resuelve el caso mas pequeño del
problema?
2.- ¿Cómo se resuelve el caso general del
problema, sabiendo que tiene el caso anterior
mas pequeño?
IMPLEMENTACIÓN
ALGORITMOS RECURSIVOS
22. IMPLEMENTACIÓN
ALGORITMOS RECURSIVOS
• Ejercicio: Escribir una función recursiva que calcule la
división entera entre dos números:
int DivisionEntera(int a, int b, int &resto)
{
int cociente;
if ( a < b) {
resto = a;
cociente = 0;
}
else
{
a= a - b;
cociente = cociente + 1;
cociente = DivisionEntera(a, b, resto);
}
return cociente;
}