Ayuda con este codigo recursivo

Iniciado por ++c, 24 Septiembre 2014, 22:47 PM

0 Miembros y 1 Visitante están viendo este tema.

++c

Hola me estoy iniciando en la recursividad y me encuentro estancado en este código para arrojar de forma recursiva la devolución de una frase al revés.

Había pensado en guardar la frase en un array, seguidamente con un índice ir moviendome por este array recursivamente, pero me encuentro que no se como devolver el retorno de la función a la función principal, independientemente de que esté bien ideado el código......


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

void alreves (char vector[],int posicion);

void main(int argc, char *argv[]){

    char cadena[50];
    int n;
    printf("\nIntroduzca frase: ");
    gets(cadena);
    n=strlen(cadena);
alreves(cadena,n);
}

void alreves (char vector[],int posicion){

    if(posicion=='\0')
        return 0 ;
    else
        alreves(vector,posicion-1);
}


Gracias!!

rir3760

Lo primero que debes hacer es cambiar el tipo de retorno de la función main a int y ya que no utilizas los argumentos de linea de comandos su definición debe terminar como "int main(void) ...".

También hay que eliminar la variable "n" ya que solo pasa la cubeta y sustituir el uso de gets por fgets, la explicación de esto en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

----

En cuanto a la función no es necesario el segundo argumento, esta en pseudocodigo es:
funcion -- argumento es la direccion en memoria de la cadena
   Si el -carácter actual- es diferente de '\0'
      llamada recursiva pasando la direccion del -siguiente caracter-
      imprimir el -caracter actual-
   fin si
fin funcion


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

++c

Hola rir3760 gracias por contestar.

Te cuento el uso de gets porque fgets me arroja ' \n ', ya me avisaste hace un tiempo de este mal uso.

Las indicaciones que me has puesto creo que son con punteros ya que me indicas direcciones, pero aún no he llegado a ese tema, cuando acabe estos ejercicios de recursividad me pondré con ello. No obstante he visto ahora algo por encima pero tengo que verlo con más detalle como trabajan ya que se me queda colgado el código, te cuelgo lo que he modificado del programa pero me gustaría me guiaras también para hacerlo sin punteros.



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 50

void alreves (char *vector);

int main(void){

    char cadena[N];
    printf("\nIntroduzca frase: ");
    fgets(cadena,sizeof cadena,stdin);
    printf("\nFrase invertida: ");
    alreves(cadena);
}

void alreves (char *vector){

    if(*vector!='\0'){ /*Estado general*/
            alreves(vector+1);
            putchar(*vector);
    }
    else return ; /*Estado base*/
}


Gracias !!

rir3760

Cita de: ++c en 25 Septiembre 2014, 20:09 PMTe cuento el uso de gets porque fgets me arroja ' \n ', ya me avisaste hace un tiempo de este mal uso.
Nada impide que elimines el avance de linea mediante la función strchr (prototipo en <string.h>) o un bucle.

Cita de: ++c en 25 Septiembre 2014, 20:09 PMNo obstante he visto ahora algo por encima pero tengo que verlo con más detalle como trabajan ya que se me queda colgado el código
Ese programa funciona correctamente, si el programa en un momento dado se congela asegúrate de publicar la versión tal cual, sin cambios.

Cita de: ++c en 25 Septiembre 2014, 20:09 PMLas indicaciones que me has puesto creo que son con punteros ya que me indicas direcciones, pero aún no he llegado a ese tema [...] te cuelgo lo que he modificado del programa pero me gustaría me guiaras también para hacerlo sin punteros.
No es posible por lo siguiente:

1) Todo parámetro de una función declarado en la forma "T identificador[N]" se procesa en realidad como "T *identificador", en otras palabras cada parámetro declarado como array se procesa como un puntero.

2) El operador "[]" requiere de dos operandos: un entero y un puntero sin importar el orden, cuando uno de ellos es el nombre de un array este genera de forma automática el puntero necesario.

Como espero entenderás no hay escape: se utilizan punteros (direcciones de memoria) si o si.

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

++c

CitarNada impide que elimines el avance de linea mediante la función strchr (prototipo en <string.h>) o un bucle.
Tomo nota  ;D

CitarEse programa funciona correctamente, si el programa en un momento dado se congela asegúrate de publicar la versión tal cual, sin cambios.
Sí que funciona!! Lo más probable que tocara algo... ;)

CitarNo es posible por lo siguiente:

1) Todo parámetro de una función declarado en la forma "T identificador[N]" se procesa en realidad como "T *identificador", en otras palabras cada parámetro declarado como array se procesa como un puntero.

2) El operador "[]" requiere de dos operandos: un entero y un puntero sin importar el orden, cuando uno de ellos es el nombre de un array este genera de forma automática el puntero necesario.

Como espero entenderás no hay escape: se utilizan punteros (direcciones de memoria) si o si.
Más claro imposible  ;-)

Gracias!!