marcelogarberoglio / PI

Para realizar consultas
4 stars 0 forks source link

Ej. 6 Guía 9 #31

Closed smesarubio closed 2 years ago

smesarubio commented 2 years ago

Hola, me gustaría saber si esta bien el declarar una variable static adentro de una función recursiva, porque no puedo llamar a la función dos veces.

int esPalindromo(char * str);
int main(){
    printf("%i\n", esPalindromo("neuquen"));  
    return 0;
}

int esPalindromo(char * str){
    static int x=1; //Esta es la variable en cuestión.
    printf("%c %c\n", str[0], str[strlen(str)-x]);
    if(str[0]==0){
        return 1;
    }
    if(str[0]!=str[strlen(str)-x]){
        return 0;
    }
    if(str[0]==str[strlen(str)-x]){
        x++;
        return  esPalindromo(str+1);
    }
    return 0;
}

También me gustaría saber como resolverlo. Muchas Gracias

marcelogarberoglio commented 2 years ago

No, no está bien, ya que no se está resolviendo en forma recursiva y además solo sirve si se usa la función una sola vez durante el programa, por ejemplo probá lo siguiente:

int esPalindromo(char * str); int main(){ printf("%i\n", esPalindromo("neuquen"));
printf("%i\n", esPalindromo("aca"));
printf("%i\n", esPalindromo("no es capicua"));
printf("%i\n", esPalindromo("aaaa"));
return 0; }

Esta función la íbamos a resolver en clase el martes, pero te anticipo: si necesitás un valor inicial para poder resolverlo, entonces podés agregar un parámetro más (salvo que el enunciado lo prohíba) y hacés una función wrapper que le pase ese valor inicial.

smesarubio commented 2 years ago

Muchas gracias. Tambien tengo esta solución.

int esPalindromo(char * str,int x);
int main(){
    printf("%i\n", esPalindromo("neuquen",0));  
    printf("%i\n", esPalindromo("hola",0));  
    return 0;
}

int esPalindromo(char * str, int x){
    if(x==0){
        x=1;    
    }
    printf("%c %c\n", str[0], str[strlen(str)-x]);
    if(str[0]==0){
        return 1;
    }
    if(str[0]!=str[strlen(str)-x]){
        return 0;
    }
    if(str[0]==str[strlen(str)-x]){
        x++;
        return  esPalindromo(str+1, x);
    }
    return 0;
}
marcelogarberoglio commented 2 years ago

¿Pasa el testeo publicado? No deberías usar strlen en la función recursiva.

smesarubio commented 2 years ago

Ahora si? Pregunto mas que nada para saber si entendí bien el concepto de "wrapper" .


int wrapperPalindromo(char * str);
static int esPalindromo(char * str, int x);

int main(){
    printf("%i\n", wrapperPalindromo("neuquen"));
    printf("%i\n", wrapperPalindromo("aca"));
    printf("%i\n", wrapperPalindromo("no es capicua"));
    printf("%i\n", wrapperPalindromo("aaaa"));
    return 0;
}

int wrapperPalindromo(char * str){
    if(str[0]==0){
        return 0;
    }
    return esPalindromo(str, 1);
}

static int esPalindromo(char * str, int x){
    if(str[0]==0){
        return 1;
    }
    if(str[0]!=str[strlen(str)-x]){
        return 0;
    }
    if(str[0]==str[strlen(str)-x]){
        x++;
        return  esPalindromo(str+1, x);
    }
    return 0;
}

Output:

1
1
0
1
marcelogarberoglio commented 2 years ago

Está bien el concepto de wrapper pero no está bien utilizada, podrías pasar algún otro valor más útil que 1, y así poder hacer lo que te mencioné en la respuesta anterior: "No deberías usar strlen en la función recursiva."