Vous êtes sur la page 1sur 5

UNIVERSIDAD DON BOSCO

FACULTAD DE ESTUDIOS TECNOLÓGICOS


ESCUELA DE COMPUTACION
GUIA DE LABORATORIO #11
Nombre de la Practica: Funciones recursivas en C++
Lugar de Ejecución: Centro de Computo
CICLO: 01/ 2013
Tiempo Estimado: 2 horas y 30 minutos
MATERIA: Introducción a la Programación

I. OBJETIVOS

Que el estudiante:
• Defina los conceptos de Recursividad y Funciones
• Diseñe funciones recursivas al plantear una solución de un problema con C++

• Practique todos los conceptos relacionados a la creación y uso de funciones, como antesala a la programación
orientada a objetos POO

II. INTRODUCCION TEORICA

Concepto de 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).
+ Esta 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, hasta la que realizo la llamada inicial.

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, siempre de forma más simple, hasta que
llegue un momento en que el problema planteado sea justamente igual al que si puede resolver.

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


En ese momento de la función, esta devolverá a la llamada anterior un resultado exacto, y cada llamada anterior
devolverá el resultado a las llamadas recursivas que le preceden.

La condición (o condiciones) a cumplirse para que un problema se pueda resolver de forma recursiva hacen que
la función pueda escribirse en forma recursiva, llamándose a si misma y que la especificación del problema tenga
una solución trivial. Esta solución trivial permite establecer una condición de paro a las llamadas recursivas de la
función.

1/5
Guía # 11: Funciones recursivas en C++

Ejemplo de construcción de una función con recursividad


El mejor ejemplo de este tipo de problemas es la solución del factorial de un número entero positivo, ya que si
recordamos el factorial de un número es el producto de todos los números enteros menores o iguales que el
número dado originalmente.
Factorial del termino
En forma general: n! = n x (n-1) x (n-2) x… x 2 x 1
anterior al n solicitado
Este problema es posible plantearlo de forma recursiva, así: n! = n x (n-1)!

La forma recursiva plantea el problema a resolver de forma más simple o más pequeña, ya que ya no se calcula el
factorial de la n original, sino el factorial del valor anterior al n, es decir, el término ( n - 1 ) .

La solución trivial (condición de parada a llamadas recursivas) para el caso del factorial es el factorial de los
números 1 o 0, que por definición es 1. Cuando se llegue a este caso trivial las llamadas recursivas pararán, ya que
este es el problema que la función si puede resolver, sin duda alguna.

Para analizar el diseño recursivo del cálculo del factorial, observe el primer ejemplo del procedimiento.

III. MATERIALES Y EQUIPO

Para la realización de la guía de práctica se requerirá lo siguiente:

No. Requerimiento Cantidad


1 Guía de Laboratorio #11 de IP 1
2 Disquete ó Memoria USB 1
3 PC con programa DEV-C++ 1

IV. PROCEDIMIENTO

1. Cree una carpeta denominada IP_ejerciciosPractica11, en la cual guardara los siguientes códigos fuentes
solicitados a continuación

2. Tenga en cuenta que debe responder a las preguntas al final de algunos de estos códigos fuentes.

Ejemplo #1: Calcular el factorial de un número utilizando recursividad

/***************************************************************
* Calcular el factorial de un número utilizando recursividad *
****************************************************************/
#include <iostream>
using namespace std;
#include <conio.h>

//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

Introducción a la Programación 2
Guía # 11: Funciones recursivas en C++

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);
getch();
}

//Definición de la función factorial


long int factorial(int n){
if((n == 0) || (n == 1)){ //condición trivial: de retorno de función
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 al n actual*/
return (n * factorial(n-1));
}
}

Ejemplo #2: Programa que lee una frase y luego la escribe de forma inversa (con letras invertidas).

/****************************************************************
* PROGRAMA QUE LEE UNA LÍNEA DE TEXTO CARACTER A CARACTER *
* Y LUEGO LOS ESCRIBE DE FORMA INVERSA USANDO RECURSIVIDAD *
****************************************************************/
#include<iostream>
using namespace std;
#include<conio.h>

#define EOLN '\n'

void invertir(void); //prototipo de la funcion

//definiciones de funciones
main(){ //funcion principal
cout<<"Introduzca una linea de texto:\t";
invertir(); //llamada inicial de funcion recursiva
getch();
}

Introducción a la Programación 3
Guía # 11: Funciones recursivas en C++

void invertir(void){
char a; //guarda solo un caracter ASCII
a = getche(); // almacena una tecla presionada por usuario

//Condicion de parada de recursividad


//if(a != EOLN)

if(a != 13)
invertir(); //nuevamente la funcion se llama a si misma
else
cout<<endl<<endl<<"Frase anterior con sus letras invertidas es:\t";

if(a!=13)
cout<<a; // escribe en pantalla el caracter ASCII almacenado en variable a
}

Importante:
+ Ingrese una frase y presione Enter. Vera que se le muestra la misma frase pero con cada una de sus letras
invertidos
+ Explique paso a paso, ¿Como realiza su trabajo la función invertir ()?
Tome de ejemplo la frase de entrada “abc_123”.

Ejemplo #3: Programa que encuentra el Máximo Común Divisor (MCD) de dos números enteros

#include <iostream>
using namespace std;

#include <conio.h>

int MCD(int x, int y);//prototipo de la funcion

main(){//funcion principal del programa


int v1, v2;
cout<<"\tPrograma para calculo de Maximo Comun Divisor de 2 numeros enteros";
cout<<endl<<"Introduzca el primer valor entero: "; cin>>v1;
cout<<endl<<"y ahora el segundo valor entero: "; cin>>v2;
cout<<endl<<endl<<"Resultado: El MCD de "<<v1<<" y "<<v2<<" es:\t";
cout<<MCD(v1,v2);
getch();
}

int MCD(int x, int y){


//Condicion de parada de recursividad
if(y==0)
return x;
else
return MCD(y,x%y);
}

Introducción a la Programación 4
Guía # 11: Funciones recursivas en C++

Importante:
+ Compile y ejecute el programa anterior. Ingrese los números 5 y 8. ¿Cuál es el MCD devuelto?
+ Ejecute de nuevo e ingrese los números 315 y 42. Explique paso a paso, ¿Como la función MCD calcula y
devuelve 21 (que es el máximo valor que los divide exactamente a ambos valores)?

3. Finalmente, resuelva cada uno de los siguientes problemas, para que al finalizarlos, sean evaluados por
su instructor.

PROBLEMAS A RESOLVER AL FINALIZAR PROCEDIMIENTO:

Problema 1:
Realice un programa que solicite al usuario la Base y el Exponente de la potencia que se desea calcular, para luego
mostrarle respuesta en pantalla. Tener muy en cuenta los siguientes aspectos para la solución:
• Se deben crear una función denominada POTENCIA ( ), que reciba ambos valores de la potencia a
calcular en 2 parametros, para finalmente retornar resultado.
• Queda a su decisión utilizar Recursividad, aunque se recomienda su implementacion!!
• Tomar en cuenta que la Base y la Potencia deben ser valores enteros. Y también, cualquiera de ambos
valores pueden ser positivos, negativos o ceros.
• No puede utilizar la librería Math.h

Problema 2:

Se necesita determinar el sueldo neto mensual a pagar a un empleado que trabaja por horas. Los porcentajes (%)
que se aplican al sueldo base del empleado son:
Renta: 7% AFP: 4.5% Seguro Social: 3%
La hora de trabajo se paga a $ 7.50
Las horas extras se pagan el doble de una hora de trabajo normal. y están sujetas también a los descuentos de ley.

• Elabore una función denominada SueldoNeto( ) que utilice exclusivamente parámetros para recibir la
información de entrada requerida, asi como devolver el sueldo neto (liquido) a pagar al empleado.
• La función imprime en pantalla solamente los montos ($) de los descuentos de ley aplicados

V. DISCUSION DE RESULTADOS

• Hacer una función recursiva que calcule el enésimo elemento de la serie: 4, 6, 10, 16, 26, 42…

• Haga un programa en C que defina una función que le permita obtener el logaritmo de un número en una
base cualquiera. La base y el número deben ser solicitados al usuario desde main.
La función consta de 3 argumentos: la base y el exponente, además, la respuesta a devolver.
Ejemplos de algunos logaritmos que debe poder calcular: Log 5 125 , Log 7 26.34

VII. BIBLIOGRAFIA

• Deitel, Harvey M. y Deitel, Paul J. CÓMO PROGRAMAR EN C++. 1ra Edición, Editorial Mc Graw Hill
• Pappas, Chris H. y Murray, William H. MANUAL DE REFERENCIA DE VISUAL C++ 6.0. 4ta Edición.
Editorial Prentice Hall (PEARSON).
• Joyanes Aguilar, Luís. PROGRAMACIÓN EN C++ - ALGORITMOS, ESTRUCTURAS DE DATOS Y
OBJETOS. Editorial McGraw Hill, España, 2000.

Introducción a la Programación 5