Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Denok en 16 Diciembre 2011, 01:16 am



Título: Dudas de recursividad
Publicado por: Denok en 16 Diciembre 2011, 01:16 am
Hola, estoy aprendiendo a programar usando recursividad y no acabo de entenderlo del todo.

Os pongo un ejemplo y os presento mis dudas:
Código:
#include <iostream>
#include <string>
using namespace std;

void invertir(){
string tmp;
if(cin >> tmp){
invertir();
cout << tmp << endl;
}
}

int main(){
invertir();
}

Este código lo que hace es invertir palabras. Por ejemplo, yo le entrego tres nombres: Jaime, Ramon, Pablo y me devuelve Pablo, Ramon, Jaime.
No entiendo como lo hace, quiero decir, la función entra en un bucle mientras le estén introduciendo datos, pero es que cuando esta dentro de el bucle vuelve a llamarse a si misma, y entonces nunca llegaría al cout << tmp << endl; no? Pues cuando se acabe de introducir datos no entrara al bucle i no passara por el cout.

Ademas, como la variable tmp puede guardar tantos nombres ? No se deberían machacar, quiero decir al poner Jaime i en la siguiente vez Ramon, no se machaca la variable ? Porque sino es que escribe el cout cada vez que pasa por el bucle(que es lo que supongo que pasa) pero no se como lo hace entonces.

No se si me he explicado bien, espero que me podáis ayudar.

En el caso del factorial recursivo me pasa mas o menos lo mismo, no acabo de entender como se guardan los datos, si se deberian machar, etc.

Muchísimas gracias!!

Adiós!


Título: Re: Dudas de recursividad
Publicado por: x64core en 16 Diciembre 2011, 03:20 am
la recursividad no es muy aconsejable porque se necesita mucho recursos de la pila ya que cada parametro lo inserta
por cada "paso" que hace por la funcion, lo que quieras hacer trata de hacerlo con bucles.
este codigo extraido del libro que aprendi C++ es un ejemplo acerca de las permutaciones:
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. /* Prototipo de función */
  5. void Permutaciones(char *, int l=0);
  6.  
  7. int main(int argc, char *argv[]) {
  8.   char palabra[] = "ABCDE";
  9.  
  10.   Permutaciones(palabra);
  11.  
  12.   cin.get();
  13.   return 0;
  14. }
  15.  
  16. void Permutaciones(char * cad, int l) {
  17.   char c;    /* variable auxiliar para intercambio */
  18.   int i, j;  /* variables para bucles */
  19.   int n = strlen(cad);
  20.  
  21.   for(i = 0; i < n-l; i++) {
  22.      if(n-l > 2) Permutaciones(cad, l+1);
  23.      else cout << cad << ", ";
  24.      /* Intercambio de posiciones */
  25.      c = cad[l];
  26.      cad[l] = cad[l+i+1];
  27.      cad[l+i+1] = c;
  28.      if(l+i == n-1) {
  29.         for(j = l; j < n; j++) cad[j] = cad[j+1];
  30.         cad[n] = 0;
  31.      }
  32.   }
  33. }