Está en la página 1de 6

Departamento de Informática y Tecnología Educativa

DITE-UNEFM
______________________________________________________________________________________

UNIVERSIDAD NACIONAL EXPERIMENTAL


“FRANCISCO DE MIRANDA”
VICE-RECTORADO ACADÉMICO
PROGRAMA: EDUCACIÓN MENCIÓN: INFORMÁTICA
UNIDAD CURRICULAR: COMPUTACIÓN II

Guía #02: Recursividad

Recursividad: La recursividad es una técnica de programación que se utiliza para realizar una
llamada a una función desde la misma función “una función se llama a si misma”, es por lo tanto
un bucle que debe tener una manera de terminar.

¿Qué ocurre en una función recursiva?

int suma(int n)
{ n (n==1) n+suma(n-1) suma(n-1) Retorna
if(n==1)
{ 4 No 4+suma(3) 6 10
return 1;
}
else 3 No 3+suma(2) 3 6
{
return n+suma(n-1); 2 No 2+suma(1) 1 3
}
} 1 Si - - 1

Cuando se llama a una función desde la misma función, ésta almacena todas las variables y
demás datos que necesita para completar la función en un bloque interno.

La siguiente vez que es llamada la función hace exactamente lo mismo, creando otro bloque
interno, este ciclo se repite hasta alcanzar la última llamada de la función, entonces empieza a
regresar los bloques utilizando estos para completar cada llamada.

Lic. Yamila Bolívar, Lic. Jesús Rojas


Departamento de Informática y Tecnología Educativa
DITE-UNEFM
______________________________________________________________________________________

Tipos de Recursión.

 Recursividad Simple: Aquella en cuya definición sólo aparece una llamada recursiva.
double factorial(int num)
{
if(num<=1)
return 1;
else
return(num*factorial(num-1));
}

Corrida de una Función Recursiva Simple

num (num<=1) Num*factorial(num-1) factorial(num-1) Retorna

4 No 4*factorial(3) 6 24

3 No 3*factorial(2) 2 6

2 No 2*factorial(1) 1 2

1 Si - - 1

 Recursividad Múltiple: cuando hay más de una llamada a si misma dentro del cuerpo de
la función.
int fibo (int n)
{
if(n<=1)
return 1;
else
return (fibo(n-1)+fibo(n-2));
}

Corrida de una Función Recursiva Múltiple

n (n<=1) fibo(n-1)+fibo(n-2) fibo(n-1) fibo(n-2) Retorna

4 No fibo(3)+fibo(2) 3 2 5

3 No fibo(2)+fibo(1) 2 1 3

2 No fibo(1)+fibo(0) 1 1 2

1 Si - - - 1

Lic. Yamila Bolívar, Lic. Jesús Rojas


Departamento de Informática y Tecnología Educativa
DITE-UNEFM
______________________________________________________________________________________

 Recursividad Anidada: En algunos de los argumentos de la llamada recursiva hay una


nueva llamada a si misma.
int Ack( int n, int m )
{
if(n==0 ){
return(m+1);
}
else{
if(m==0){
return(Ack(n-1,1));
}
else
{
return(Ack(n-1, Ack(n,m-1)));
}
}
}

Corrida (parcial) de una Función Recursiva Anidada

n m (n==0) (m==0) Ack(n-1,1) Ack(n-1, Ack(n,m-1)) Ack(n,m-1)) Retorna

1 1 No No - Ack(0, Ack(1,0)) Ack(1,0) -

1 0 No Si Ack(0,1) - - -

0 1 Si - - - - 2

Ack(0, 2)

0 2 Si - - - - 3

Lic. Yamila Bolívar, Lic. Jesús Rojas


Departamento de Informática y Tecnología Educativa
DITE-UNEFM
______________________________________________________________________________________

 Recursividad Cruzada o Indirecta: son algoritmos donde una función provoca llamada
a si misma de forma indirecta a través de otras funciones.
Función 1
int par(int nump)
{
if(nump==0)
return 1;
else
return (impar(nump-1));
}

Función 2
int impar (int numi)
{
if(numi==0)
return 0;
else
return(par(numi-1));
}

Corrida de una Función Recursiva Cruzada (valor Par)

nump numi (nump==0) (numi==0) impar(nump-1) par(numi-1) Retorna

4 - No - impar(3) - 1

- 3 - No - par(2) 1

2 - No - impar(1) - 1

- 1 - No - par(0) 1

1
0 - Si - - -
(verdadero)

Corrida de una Función Recursiva Cruzada (valor Impar)

nump numi (nump==0) (numi==0) impar(nump-1) par(numi-1) Retorna

3 - No - impar(2) -

- 2 - No - par(1)

1 - No - impar(0) -

0
- 0 - Si - -
(Falso)

Lic. Yamila Bolívar, Lic. Jesús Rojas


Departamento de Informática y Tecnología Educativa
DITE-UNEFM
______________________________________________________________________________________

Algunos Ejemplos

Ejemplo 1: Cree un programa que calcule la suma de los primero n número enteros a partir de un valor
dado. Sume los valores usando una función recursiva.

#include <iostream>
using namespace std;
int suma(int n);
int main()
{
int n, s;
cout << "Introduzca el ultimo valor: ";
cin >> n;
s=suma(n);
cout << "La suma de los primeros " << n << " numero enteros es " << s << "\n";
system("pause");
return 0;
}
int suma(int n)
{
if(n==1) //indica cuando termina la función
{
return 1;
}
else
{
return n+suma(n-1); //llama la función, restándole uno al indicador 'n'
}
}

Ejemplo 2: Cree un programa que calcule, usando una función recursiva, el factorial de un número dado:

#include<iostream>
using namespace std;
double factorial(int num);//prototipo
int main()
{
int num; //variables locales
system("clear");
cout << "Obtener el Factorial de:\n";
cin >> num;
cout << "El Factorial de "<< num <<" es..."<<factorial(num);//llamado de función
cout << "\n";
system("pause");
}

double factorial(int num)


{
if(num<=1)
{
return 1;
}
else
{
return(num*factorial(num-1));//llamado interno de la función
}
}

Lic. Yamila Bolívar, Lic. Jesús Rojas


Departamento de Informática y Tecnología Educativa
DITE-UNEFM
______________________________________________________________________________________

UNIVERSIDAD NACIONAL EXPERIMENTAL


“FRANCISCO DE MIRANDA”
VICE-RECTORADO ACADÉMICO
PROGRAMA: EDUCACIÓN MENCIÓN: INFORMÁTICA
UNIDAD CURRICULAR: COMPUTACIÓN II

GUÍA #02: Ejercicios de Recursividad

Emplear funciones recursivas para cada uno de los siguientes enunciados.

1.- Obtener el promedio de los elementos de un vector.


2.- Calcular la suma de n números naturales, de la siguiente forma: S=1+2+3+…+(n-1)+n
3.- Obtener los resultados de las siguientes formulas:
a) y=(x1+x2+…+xn)

x2 x3 x4 n x
n
b) y= 1 − x+ − + + ... + (−1)
2! 3! 4! n!
c) p=(f1*f2*…*fn)
4.- Mostrar el inverso de un número leído, por ejemplo: número: 526… inverso: 625
5.- Dividir dos números enteros.

Lic. Yamila Bolívar, Lic. Jesús Rojas

También podría gustarte