Saber si es palíndromo o no, de forma recursiva 2da parte

Pues la idea que se me ocurrió en el otro post resultó ser más sencilla de lo que me imaginé, y ahora sí la función recursiva se ve mucho mejor, ya es mucho más que un ciclo disfrazado.

Comenté extensivamente el código, así que aquí está:

#include
#include
using namespace std;
int len, n=0;

string chk4palindrosity(string thestr)
{
    if(thestr[0] == thestr[thestr.length() - 1]) // comparar primer caracter con ultimo
    {
        n++;
        if(n == len / 2) // si el numero de veces que la comparación ha sido cierta es...
            return "Si es palindromo!"; // igual a la mitad de los caracters, es palindromo
        thestr.erase(0, 1); // borramos primer caracter
        thestr.erase(thestr.length() - 1, 1); // borramos ultimo
        return chk4palindrosity(thestr); // llamamos a la función con el string recortado
    }
    else // si una de las comparaciones no es cierta, no es palíndromo
        return "No es palindromo";
}

int main()
{
    char inputf[50]={0}, input[50], *parte;
    cout<<"Introduce un palindromo: "; cin.getline(input, 'n');

    parte = strtok(input, " ");                 //
    strcat(inputf, parte);                     //
    while((parte = strtok(NULL, " ")) != NULL) //
        strcat(inputf, parte);               // quitar espacios del array

    string thestr(inputf); // convertir array en string para facilitar operaciones
    len = thestr.length(); // obtener longuitud del string
    if(len == 1)
        cout << "Si es palindromo!";
    else
        cout << chk4palindrosity(thestr); // llamar a la funcion e imprimir lo que retorne
    cin.get();
}

Lo que hace la función recursiva es comparar el primer caracter con el último, si son iguales recortarlos y llamarse; si no, no es palíndromo. Cualquier duda ya saben que los comentarios están abiertos.

4 thoughts on “Saber si es palíndromo o no, de forma recursiva 2da parte

  1. #include

    enum bool {FALSE,TRUE};
    typedef enum bool boolean;

    #define MAX 1000

    char line[MAX];//variable externa

    int linea(void);

    boolean testPalindrome(char [],int,int);
    int main()
    {
    int i,c;
    int j;

    j=linea();
    printf(“%d “,j);
    printf(” n”);

    printf(“%d “,testPalindrome(line,0,j));
    return 0;
    }

    boolean testPalindrome(char line[],int inic,int size)

    {

    if(line[inic]==line[size-1])
    {

    return TRUE;
    }
    else
    return FALSE;
    testPalindrome(line,inic+1,size-1);
    //printf(“%c “,a[inic+2]);
    }

    int linea(void){

    int i,c;
    extern char line[];
    //int j;

    for(i=0;i<=MAX-1 && (c=getchar())!=EOF && c!='';++i)
    line[i]=c;

    printf("n");
    if(c=='n'){
    line[i]=c;
    ++i;
    }
    line[i]='';

    testPalindrome(line,0,i);

    return i;

    // for(i=0;i<=MAX-1;++i)
    // printf("%c ",line[i]);

    }

  2. ese codigo no es recursivo
    #include
    #include

    using namespace std;
    bool isPalindrome(string st)
    {
    if(st.length()<2) return true; //si tiene solo 1 caracter es un palindromo
    if(st[0]!= st[st.length()-1]) return false; //si las letras de inicio y final son distintas resulta falso
    return isPalindrome(st.substr(1,st.length()-2)); //intenta de nuevo eliminando las letras ya provadas
    }
    int main()
    {
    string str;
    getline(cin,str);
    cout<<isPalindrome(str)<<endl;
    return 0;
    }

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s