Recursividad en C

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
Anon
Mensajes: 15
Registrado: 07/03/2013 12:00 pm

Recursividad en C

#1 Mensaje por Anon » 13/03/2013 10:54 am

Código: Seleccionar todo

/* Programa que gira la cadena introducida.
 * Hacer con recursividad.
 */

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

void girar (char *, char, int);

int main()
{
  char cadena[20], aux;
  int j=0;
  printf ("Introduce una cadena: ");
  scanf ("%[^\n]", cadena);
  girar (cadena, aux, j);
  printf ("%s\n", cadena);
  return 0;
}

void girar (char cadena[], char letra, int j)
{
     if (j<strlen(cadena)/2)
          {
	    girar (cadena, j+1, letra);
	    letra=cadena[j];
	    cadena[j]=cadena[strlen(cadena)-j-1]; 
	    cadena[strlen(cadena)-j-1]=letra;
	  }
}
La cadena invertida no es la que debería ser. ¿Porque?¿Dónde esta el fallo?

Anon
Mensajes: 15
Registrado: 07/03/2013 12:00 pm

#2 Mensaje por Anon » 13/03/2013 1:16 pm

Versión mejorada

Código: Seleccionar todo

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

void giro_cad (char *, char *, int, int);
int main()
{
  char cadena[50], cadena2[50];
  int i=0, longitud;
  printf ("Introduce cadena: ");
  scanf ("%[^\n]", cadena);
  longitud=strlen(cadena);
  giro_cad (cadena, cadena2, i, longitud);
  printf ("%s", cadena2);
  return 0;
}
void giro_cad (char cadena[], char cadena_aux[], int i, int longitud)
{
/* for (i=0; i<longitud; i++)
 * {
 *    cadena_aux[longitud-i-1]=cadena[i];
 * }
 */
  if (i<longitud)
    {
      cadena_aux[longitud-i-1]=cadena[i];
      giro_cad (cadena, cadena_aux, i+1, longitud);
    }
}
¡Se aceptan propuestas!

Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

#3 Mensaje por rir3760 » 13/03/2013 6:20 pm

Si la intención es imprimir una cadena al revés varias aproximaciones se encuentran en el tema Poner las palabras de una cadena a reves.

O si el objetivo es invertir la cadena y almacenarla en el array indicado lo mejor (por sencillo) es la forma iterativa:

Código: Seleccionar todo

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

#define NUM_CHARS  80

void invertir(char const *cad, char *inv);

int main(void)
{
   char cad[NUM_CHARS];
   char inv[NUM_CHARS];
   
   puts("Introduce la cadena: ");
   scanf("%[^\n]", cad);
   invertir(cad, inv);
   printf("\"%s\" ==> \"%s\"\n", cad, inv);
   
   return EXIT_SUCCESS;
}

void invertir(char const *cad, char *inv)
{
   char const *p;
   
   for (p = cad; *p != '\0'; p++)
      ;
   
   while (p > cad)
      *inv++ = *--p;
   *inv = '\0';
}
Pero si la idea es practicar con funciones recursivas:

Código: Seleccionar todo

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

#define NUM_CHARS  80

void invertir(char const *first, char const *last, char *inv);

int main(void)
{
   char cad[NUM_CHARS];
   char inv[NUM_CHARS];
   
   puts("Introduce la cadena: ");
   scanf("%[^\n]", cad);
   invertir(cad, cad + strlen(cad), inv);
   printf("\"%s\" ==> \"%s\"\n", cad, inv);
   
   return EXIT_SUCCESS;
}

void invertir(char const *first, char const *last, char *inv)
{
   if (first == last)
      *inv = '\0';
   else {
      *inv++ = *--last;
      invertir(first, last, inv);
   }
}
Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Avatar de Usuario
leosan
Mensajes: 730
Registrado: 19/04/2012 8:35 am
Ubicación: GRAN CANARIA

Re: Recursividad en C

#4 Mensaje por leosan » 13/03/2013 9:37 pm

Dejando aparte la lección magistral del uso de punteros del amigo rir, creo que el único error que tienes es la falta del caracter nulo al final de la cadena, y funciona y todo:

Código: Seleccionar todo

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

void giro_cad (char *, char *, int, int);
int main()
{
  char cadena[50], cadena2[50];
  int i=0, longitud;
  printf ("Introduce cadena: ");
  scanf ("%[^\n]", cadena);
  longitud=strlen(cadena);
  giro_cad (cadena, cadena2, i, longitud);
  printf ("%s", cadena2);
  return 0;
}
void giro_cad (char cadena[], char cadena2[], int i, int longitud)
{
  if (i==longitud)
    cadena2[i]='\0';
  if (i<longitud)
    {
      cadena2[longitud-i-1]=cadena[i];
      giro_cad (cadena, cadena2, i+1, longitud);
    }

}
Saluditos!. .... Imagen

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados