Documentos de Académico
Documentos de Profesional
Documentos de Cultura
int main(){
char c;
cout << "Pulsa un numero : ";
cin >> c;
comprobar(c);
cout << "Programa terminado." << endl;
}
Recursividad: ejemplo 2
En este ejemplo vamos a hacer que el usuario escriba una frase y nosotros la
repetimos un determinado n�mero de veces.
Evidentemente ser�a mucho m�s f�cil resolver el problema utilizando un
bucle, pero aqu� se trata de ver c�mo se puede resolver tambi�n mediante
una funci�n recursiva. Veamos el ejemplo :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using namespace std;
int main(){
string f;
int n=5;
cout << "Escribe una frase. Yo la repetire 5 veces." << endl;
getline(cin, f);
cout << endl;
escribir(f,n);
}
int main(){
int n, r;
cout << "FACTORIAL : Escribe un numero : ";
cin >> n;
r=factorial(n);
cout << n << "! = " << r << endl;
}
int factorial(int n) {
if(n < 0) return 0;
else if(n > 1) return n*factorial(n-1); // Recursividad: n>1
return 1; // Condici�n para n == 1 y n == 0
}
El programa calcula el factorial del n�mero. Para n�meros negativos
devuelve el cero. Para el 0 y el 1 devuelve el 1, y para los dem�s n�meros
positivos, mediante la recursividad, vamos multiplicando cada n�mero por el
inmediatamente menor que si mismo hasta llegar a uno, para devolver el
factorial.
Recursividad en C++
lunes, 19 de marzo de 2012
Recursividad en C++
Recursividad en C++:
No todas las funciones pueden llamarse a sí mismas, sino que deben estar
diseñadas especialmente para que sean recursivas, de otro modo podrían
conducir a bucles infinitos, o a que el programa termine inadecuadamente.
Tampoco todos los lenguajes de programación permiten usar recursividad. C++
permite la recursividad.
Cada vez que se llama a una función, se crea un juego de variables locales, de
este modo, si la función hace una llamada a sí misma, se guardan sus
variables y parámetros, usando la pila, y la nueva instancia de la función
trabajará con su propia copia de las variables locales. Cuando esta segunda
instancia de la función retorna, recupera las variables y los parámetros de la
pila y continúa la ejecución en el punto en que había sido llamada.
Por ejemplo para calcular el factorial de cualquier número mayor que cero hay
que calcular como mínimo el factorial de otro número. La función que se utiliza
es la función en la que se encuentra en estos momentos, esta función debe
llamarse a sí misma para el número menor inmediato, para poder ejecutarse en
el número actual. Esto es un ejemplo de recursividad.
De esta forma podríamos crear una función recursiva para calcular el factorial
de un número entero.
El factorial se simboliza como n!, se lee como "n factorial", y la definición es:
El factorial de cero es 1.
De modo que una función bien hecha para cálculo de factoriales debería incluir
un control para esos casos:
Principios de la recursividad:
Ventajas:
· No es necesario definir la secuencia de pasos exacta para resolver el
problema.
· Soluciones simples, claras.
· Soluciones elegantes.
· Soluciones a problemas complejos.
Desventajas:
· Podría ser menos eficiente.
· Sobrecarga asociada con las llamadas a subalgoritmos
· Una simple llamada puede generar un gran número de llamadas
Recursivas. (Fact(n) genera n llamadas recursivas)
· El valor de la recursividad reside en el hecho de que se puede usar para
resolver problemas sin fácil solución iterativa.
· La ineficiencia inherente de algunos algoritmos recursivos.
7. // Torres de Hanói
#include <iostream>
using namespace std;
int main (void)
{
void hanoi (int n, int inic, int tmp, int final);
int n; // Numero de discos a mover
cout << "Numero de discos: ";
cin >> n;
hanoi (n, 1, 2, 3); // mover "n" discos del 1 al 3,
// usando el 2 como temporal.
return 0;
}
void hanoi (int n, int inic, int tmp, int final)
{
if (n > 0) {
// Mover n-1 discos de "inic" a "tmp".
// El temporal es "final".
hanoi (n-1, inic, final, tmp);
// Mover el que queda en "inic"a "final"
cout <<"Del poste "<<inic<<" al "<<final<<"\n";
// Mover n-1 discos de "tmp" a "final".
// El temporal es "inic".
hanoi (n-1, tmp, inic, final);
}
}
% Hanói
Numero de discos: 3
Del poste 1 al 3
Del poste 1 al 2
Del poste 3 al 2
Del poste 1 al 3
Del poste 2 al 1
Del poste 2 al 3
Del poste 1 al 3
8. // Visualizar las permutaciones de n elementos.
Las permutaciones de un conjunto son las diferentes maneras de colocar sus
elementos, usando todos ellos y sin repetir ninguno. Por ejemplo para A, B, C,
tenemos: ABC, ACB, BAC, BCA, CAB, CBA.
#include <iostream>
using namespace std;
/* Prototipo de función */
void Permutaciones(char *, int l=0);
int main(int argc, char *argv[]) {
char palabra[] = "ABCDE";
Permutaciones(palabra);
cin.get();
return 0;
}
void Permutaciones(char * cad, int l) {
char c; /* variable auxiliar para intercambio */
int i, j; /* variables para bucles */
int n = strlen(cad);
for(i = 0; i < n-l; i++) {
if(n-l > 2) Permutaciones(cad, l+1);
else cout << cad << ", ";
/* Intercambio de posiciones */
c = cad[l];
cad[l] = cad[l+i+1];
cad[l+i+1] = c;
if(l+i == n-1) {
for(j = l; j < n; j++) cad[j] = cad[j+1];
cad[n] = 0;
}
}
}
9. // Búsqueda binaria
#include <iostream>
using namespace std;
int Binaria(int*, int, int, int);
int tabla[] = {
1, 3, 12, 33, 42, 43, 44, 45, 54, 55,
61, 63, 72, 73, 82, 83, 84, 85, 94, 95,
101, 103, 112, 133, 142, 143, 144, 145, 154, 155,
161, 163, 172, 173, 182, 183, 184, 185, 194, 195
};
int main() {
int pos;
int valor=141;
pos = Binaria(tabla, valor, 0, sizeof(tabla)/sizeof(tabla[0])-1);
if(pos > 0) cout << "Valor " << valor << " encontrado en posicion: " << pos <<
endl;
else cout << "Valor " << valor << " no encontrado" << endl;
return 0;
}
/* Función de búsqueda binaria:
Busca el "valor" dentro del vector "vec" entre los márgenes
inferior "i" y superior "s" */
int Binaria(int* vec, int valor, int i, int s) {
int inferior = i;
int superior = s;
int central;
if(superior <= inferior) return -1;
central = inferior+(superior-inferior)/2;
if(vec[central] == valor) return central;
else if(vec[central] < valor) return Binaria(vec, valor, central+1, superior);
return Binaria(vec, valor, inferior, central-1);
}
10. // Algoritmo de Euclides
#include <iostream>
using namespace std;
int mcd(int, int);
int main() {
int a, b;
a = 364332;
b = 30252;
cout << "mcd(" << a << ", " << b << ")= " << mcd(a,b) << endl;
return 0;
}
int mcd(int a, int b) {
if(a < b) return mcd(b,a);
if(b == 0) return a;
return mcd(b, a % b);
}