[ Foro de C ]

Recursividad C

17-Jan-2016 16:54
Enrique Morales
4 Respuestas

En uno de los ejercicios en los que hay que emplear la recursividad para darle la vuelta a una cadena, utilizan en la función este metodo:

 
 if (*c != '\0') 
   { 
      invierte (c + 1); 
      putchar (*c); 
   } 
  else 
      return; 
 


Cuando le suma 1 a la cadena, ¿qué le está indicando? ¿un carácter en concreto dentro de la cadena?


17-Jan-2016 17:01
Nacho Cabanes (+30)

¿En qué curso has visto ese fuente? No me suena que sea del curso de C que puedes ver en estas páginas, porque las cadenas en C no son sencillas y los problemas de recursividad con cadenas en C tienen una lógica un tanto rebuscada y son detalles que (en mi opinión) se deberían esconder inicialmente a un principiante. Puede estar propuesto (y tampoco me parece la decisión más acertada, pensándolo ahora), pero no creo que yo lo haya resuelto usando punteros (que, además, se estudian en el tema 9, cuando las funciones se ven en el tema 7).

En cualquier caso, a falta de ver el fuente completo, me atrevería a decirte que, al ser una cadena de texto, *c es su contenido, mientras que c es la posición de memoria en la que se encuentra la cadena. Por eso, c+1 es la posición en la que se encuentra el segundo carácter, c+2 la del segundo y así sucesivamente.


17-Jan-2016 17:08
Enrique Morales

Es el ejercicio 7.10.6 del libro "Fundamentos de programación en C"

La resolución la he encontrado en este enlace:
http://www.aprendeaprogramar.com/mod/forum/discuss.php?d=677

Ojalá este tema estuviera escondido, en la universidad nos han dado una clase únicamente sobre este tema y en el examen final pondrán un par de cuestiones seguramente.
La verdad es que es difícil :(...


17-Jan-2016 17:36
Nacho Cabanes (+30)

Voy a tener que quitar ese ejercicio propuesto.  ;-)

Yo te recomendaría intentar hacerlo con las funciones normales de cadenas, que tienes en el apartado 5.2:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=615

Puedes conseguirlo con funciones como "strncpy" y "strcat", que son un poco más naturales (aunque no hay nada que ver con lenguajes más modernos, como C#, Java o Python).

Como alternativa, puedes hacerlo trabajando con la cadena como un array de caracteres.

Casi cualquier cosa es mejor (más legible) que usar punteros.  ;-)


17-Jan-2016 18:06
Enrique Morales

Al final me ha venido la inspiración...
Aquí dejo la resolución que se me ha ocurrido:

#include <stdio.h>
#include <string.h>

void darVuelta(char *cad, int numero)
{
   if(numero >= 0)
   {
       printf("%c", cad[numero]);
       darVuelta(cad, numero-1);
   }  
   else
       return;
}      

int main(int argc, char **argv)
{
   char cadena[50];
   int longitud;
 
   printf("Introduce la cadena: ");
   scanf("%[^\n]", cadena);
 
   longitud = strlen(cadena);
 
   darVuelta(cadena, longitud);
 
   return 0;
}






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)