You are on page 1of 24

Introducción a la computación

Clase 13

Introducción a las funciones recursivas

Prof. Ciro Nuñez


Ciro.nunez.i@uni.edu.pe
Introducción a las funciones recursivas

TEMAS DE LA LECCIÓN

● Definicion

● Ejemplos
Introducción a las funciones recursivas

DEFINICIÓN
● Una función recursiva es una función que se llama a si
misma
Programa principal main()

Funcion_1() Funcion_2() Funcion_3()

Funcion_5()
Funcion_4()
(recursiva)
Introducción a las funciones recursivas

DEFINICIÓN
● Una función recursiva es una función que se llama a si
misma
Introducción a las funciones recursivas

DEFINICIÓN: Recursividad f(5) ->función que calcula el factorial


de 5 Condicion de Parada : f(1)=1 || f(0)=1
La recursividad es una técnica de
programación que consiste en:
● Elaborar una función que se llame a sí misma
de forma repetida hasta satisfacer una
condición de parada (CP).
● Ésta CP determina hasta cuando se seguirá
● llamando la función a sí misma. Esta
condición se le conoce como la “solución
trivial al problema”, porque al cumplirse
provoca que se comience a retornar valores a
las llamadas anteriores de la misma función,
Introducción a las funciones recursivas

DEFINICIÓN: Recursividad
● Una función recursiva sigue la estrategia del “divide y
vencerás”, dividiendo la definición de la misma en dos
partes:

a) La parte que la función no sabe cómo resolver. La parte que


la función no sabe cómo resolver debe replantear el problema
original de modo que la solución sea más simple, o más pequeña que
la versión original del problema. Como el problema todavía no está
resuelto, sino que solamente se ha replanteado, se hace una nueva
llamada a la función para que intente resolver el problema más
pequeño. Si todavía no lo puede resolver, se vuelve a replantear,
Introducción a las funciones recursivas

DEFINICIÓN: Recursividad
● Una función recursiva sigue la estrategia del “divide y
vencerás”, dividiendo la definición de la misma en dos
partes:

● b) La parte que la función sabe cómo resolver

En ese momento, la función, devolverá a la llamada anterior un


resultado exacto. Cada llamada “anterior” devolverá el resultado
necesario a las llamadas recursivas que le preceden .
Introducción a las funciones recursivas
Introducción a las funciones recursivas
Introducción a las funciones recursivas
Introducción a las
funciones recursivas

data[5]={10,20,30,40,60};
sumArrayPublic(data,5) = data[4]+ sumArrayPublic(data,4);
sumArrayPublic(data,4) = data[3]+ sumArrayPublic(data,3);
sumArrayPublic(data,3) = data[2]+ sumArrayPublic(data,2);
sumArrayPublic(data,2) = data[1]+ sumArrayPublic(data,1);
sumArrayPublic(data,1) = data[0]
Introducción a las
funciones recursivas

Ejemplo
● Un contador recursivo

● Cual sera la salida?


Introducción a las
funciones recursivas

Ejemplo
● Un contador recursivo
Introducción a las funciones recursivas

Ejemplo
● Calcular la potencia

● con una implementación


recursiva.
Introducción a las funciones recursivas

#include <iostream>
Ejemplo using namespace std;
int fib(int n) {
● fib(n) = fib(n-1)+fib(n-2) if (n == 0 || n == 1) {
return 1;
se puede expresar
} else {
fácilmente con una return fib(n-2) + fib(n-1);
implementación recursiva. }
}

int main(){
int Numero, Fib;
for (Numero = 20; Numero >= 0; Numero--){
Fib= fib(Numero);
cout<<"Numero=:"<<Numero << "\tFib: " << Fib << endl ;
}
Return 0;
}
Introducción a las funciones recursivas

#include <iostream>
Ejemplo using namespace std;
int countfib=0; Variable Global

● Cuantas veces se llamó a la


función fib()? int fib(int n) {
countfib++;
Puede usar una variable if (n == 0 || n == 1) {
return 1;
global para averiguarlo.
} else {
return fib(n-2) + fib(n-1);
}
}

Para el ejemplo anterior,


donde n=20; countfib=:57291
Introducción a las funciones recursivas

#include <iostream>
using namespace std;

Ambito (Scope) int countfib=0; Variable Global

int fib(int n) {
Dónde se ha declarado countfib++;
if (n == 0 || n == 1) {
una variable, return 1;

determina desde } else {


return fib(n-2) + fib(n-1);

dónde puede ser }


}
accesada
int main(){
int Numero, Fibn;
countfib - tiene ámbito for (Numero = 20; Numero >= 0; Numero--){
Fibn= fib(Numero);
global - puede ser cout<<"Numero=:"<<Numero << "\tFibn: " << Fibn << endl

accesada desde ;
}

cualquier función cout<<"countfib=:"<<countfib << endl;


return 0;
}
Introducción a las funciones recursivas

int numCalls = 0;

Ambito (Scope) int raiseToPower(int base, int exponent) {


numCalls = numCalls + 1;
int result = 1;
for (int i = 0; i < exponent; i = i + 1) {
result Tiene un ámbito de result = result * base;
función. }
// A
Cada función puede tener return result;
su propia variable result }

int max(int num1, int num2) {


numCalls = numCalls + 1;
int result;
if (num1 > num2) {
result = num1;
}
else {
result = num2;
}
// B
return result;
}
Introducción a las funciones recursivas

int numCalls = 0;

Ambito global int raiseToPower(int base, int exponent) {


numCalls = numCalls + 1;

numCalls int result = 1;


for (int i = 0; i < exponent; i = i + 1)
{
result = result * base;
}
Ambito
Ambito // A
return result;
No se puede
raiseToPower()
}

acceder a
int base, int exponent, int int max(int num1, int num2) {
result numCalls = numCalls + 1; variables fuera
int result; del ámbito
if (num1 > num2) {
result = num1;

Ambito max() }
else {
result = num2;
int num1, int num2, int result }
// B
return result;
Introducción a las funciones recursivas

Error común en recursividad


● Si se omite el caso base o se escribe el paso recursivo
incorrectamente, de manera que no converja en el caso base, se
produce una recursividad “infinita”, con lo cual la memoria se
agotará en un momento dado. Esto es analógico para el problema de
un ciclo infinito en una solución iterativa (no recursiva).

Tip de rendimiento:
● Evite los programas recursivos al estilo Fibonacci que produzcan una
“explosión” exponencial de llamadas.
● Las llamadas recursivas requieren tiempo y consumen memoria
Introducción a las funciones recursivas

/* Calcular el factorial de un número utilizando recursividad */


#include <iostream>
Ejemplo using namespace std;
//prototipo de función factorial
long int factorial (int n);
Calcular el factorial de // parámetro n: ingreso del numero para calcular su factorial
un número utilizando // valor devuelto: factorial del parámetro de entrada n

recursividad int main (){


int n;
//Leer la cantidad entera ingresada por el usuario
cout<<"Calcula del factorial de un numero entero positivo"<<endl;
do{
cout<<endl<<"Digite un Numero entero positivo: ";
cin>>n;
if(n<0)
cout<<endl<<"-> error, ingreso valor negativo, intente de nuevo..";
}while(n<0);
//Calcular y visualizar el factorial
cout<<endl<<"RESULTADO de "<<n<<"! es "<< factorial(n);
return 0;
}
Introducción a las funciones recursivas

/***************************************************************

Ejemplo * Calcular el factorial de un número utilizando recursividad *


****************************************************************/
//Definición de la función factorial
Calcular el factorial de
long int factorial(int n){
un número utilizando
//condición trivial: de retorno de función
recursividad
if((n == 0) || (n == 1)){
return(1);
}
else{
/* Recursividad: Se vuelve a llamar la función factorial
con un problema más simple:
factorial del término anterior n-1 */
return (n * factorial(n-1));
}
}
Introducción a las funciones recursivas

Ejemplo
Invertir una cadena
utilizando recursividad
Introducción a las funciones recursivas

Ejemplo
Invertir una cadena
utilizando recursividad

You might also like