El documento introduce las funciones recursivas. Explica que una función recursiva es aquella que se llama a sí misma de forma repetida hasta cumplir una condición de parada. Proporciona ejemplos de funciones recursivas como calcular el factorial de un número, invertir una cadena y calcular la potencia de un número. También advierte sobre posibles errores como omitir el caso base o escribir el paso recursivo de manera incorrecta, lo que puede causar una recursividad infinita.
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
Introducción funciones recursivas
1. Introducción a la computación
Clase 13
Introducción a las funciones recursivas
Prof. Ciro Nuñez
Ciro.nunez.i@uni.edu.pe
2. Introducción a las funciones recursivas
TEMAS DE LA LECCIÓN
● Definicion
● Ejemplos
3. 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_4()
Funcion_5()
(recursiva)
4. Introducción a las funciones recursivas
DEFINICIÓN
● Una función recursiva es una función que se llama a si
misma
5. Introducción a las funciones recursivas
DEFINICIÓN: Recursividad
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,
f(5) ->función que calcula el factorial
de 5 Condicion de Parada : f(1)=1 || f(0)=1
6. 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,
7. 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.
14. Introducción a las funciones recursivas
Ejemplo
● Calcular la potencia
● con una implementación
recursiva.
15. Introducción a las funciones recursivas
Ejemplo
● fib(n) = fib(n-1)+fib(n-2)
se puede expresar
fácilmente con una
implementación recursiva.
#include <iostream>
using namespace std;
int fib(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return fib(n-2) + fib(n-1);
}
}
int main(){
int Numero, Fib;
for (Numero = 20; Numero >= 0; Numero--){
Fib= fib(Numero);
cout<<"Numero=:"<<Numero << "tFib: " << Fib << endl ;
}
Return 0;
}
16. Introducción a las funciones recursivas
Ejemplo
● Cuantas veces se llamó a la
función fib()?
Puede usar una variable
global para averiguarlo.
#include <iostream>
using namespace std;
int countfib=0;
int fib(int n) {
countfib++;
if (n == 0 || n == 1) {
return 1;
} else {
return fib(n-2) + fib(n-1);
}
}
Para el ejemplo anterior,
donde n=20; countfib=:57291
Variable Global
17. Ambito (Scope)
Dónde se ha declarado
una variable,
determina desde
dónde puede ser
accesada
countfib - tiene ámbito
global - puede ser
accesada desde
cualquier función
Introducción a las funciones recursivas
#include <iostream>
using namespace std;
int countfib=0;
int fib(int n) {
countfib++;
if (n == 0 || n == 1) {
return 1;
} else {
return fib(n-2) + fib(n-1);
}
}
int main(){
int Numero, Fibn;
for (Numero = 20; Numero >= 0; Numero--){
Fibn= fib(Numero);
cout<<"Numero=:"<<Numero << "tFibn: " << Fibn << endl
;
}
cout<<"countfib=:"<<countfib << endl;
return 0;
}
Variable Global
18. Ambito (Scope)
result Tiene un ámbito de
función.
Cada función puede tener
su propia variable result
Introducción a las funciones recursivas
int numCalls = 0;
int raiseToPower(int base, int exponent) {
numCalls = numCalls + 1;
int result = 1;
for (int i = 0; i < exponent; i = i + 1) {
result = result * base;
}
// A
return result;
}
int max(int num1, int num2) {
numCalls = numCalls + 1;
int result;
if (num1 > num2) {
result = num1;
}
else {
result = num2;
}
// B
return result;
}
19. Ambito global
numCalls
Introducción a las funciones recursivas
int numCalls = 0;
int raiseToPower(int base, int exponent) {
numCalls = numCalls + 1;
int result = 1;
for (int i = 0; i < exponent; i = i + 1)
{
result = result * base;
}
// A
return result;
}
int max(int num1, int num2) {
numCalls = numCalls + 1;
int result;
if (num1 > num2) {
result = num1;
}
else {
result = num2;
}
// B
return result;
Ambito
raiseToPower()
int base, int exponent, int
result
Ambito max()
int num1, int num2, int result
Ambito
No se puede
acceder a
variables fuera
del ámbito
20. 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
21. Introducción a las funciones recursivas
Ejemplo
Calcular el factorial de
un número utilizando
recursividad
/* Calcular el factorial de un número utilizando recursividad */
#include <iostream>
using namespace std;
//prototipo de función factorial
long int factorial (int n);
// parámetro n: ingreso del numero para calcular su factorial
// valor devuelto: factorial del parámetro de entrada n
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;
}
22. Introducción a las funciones recursivas
Ejemplo
Calcular el factorial de
un número utilizando
recursividad
/***************************************************************
* Calcular el factorial de un número utilizando recursividad *
****************************************************************/
//Definición de la función factorial
long int factorial(int n){
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));
}
}
//condición trivial: de retorno de función
23. Introducción a las funciones recursivas
Ejemplo
Invertir una cadena
utilizando recursividad
24. Introducción a las funciones recursivas
Ejemplo
Invertir una cadena
utilizando recursividad