3
votes

Pourquoi ma fonction palindrome ne fonctionne-t-elle pas?

Pour une raison quelconque, ma fonction palindrome ne fonctionne pas, j'aimerais beaucoup d'aide à ce sujet:

Code

int Pal(char *s, int a, int b)
{
    if (a>= b)
        return 1;

    if (s[a] != s[b])
        return 0;

    return Pal(s, ++a , --b);
} 

int main()
{
    char *s = "civic";

    if (Pal(s , 1, strlen(s)))
        printf("YES\n");
    else
        printf("No\n");
}


10 commentaires

Trouver un palindrome n'est pas un problème qui nécessite une récursivité. Il n'y a pas de hiérarchie impliquée, ni de collection de piles.


N'oubliez pas que les index de tableau sont basés sur zéro . Cela signifie qu'un tableau de 5 éléments a des index de 0 à 4 (inclus).


Le premier élément de char * s = "civic"; est s [0] , le dernier (sans compter le '\ 0' ) est s [4] .


Essayez Pal (s, 0, strlen (s) -1)


problème résolu, merci à tous!


s doit être char const * à la fois dans main () et comme paramètre de Pal () . int main () doit être int main (void) si cela est supposé être C et non C ++ .


dans l'appel récursif, vous pouvez simplement écrire return Pal (s, a + 1, b-1); , vous n'avez pas besoin de changer a et b lui-même


@ sturcotte06 Très peu de problèmes nécessitent la récursivité, mais beaucoup sont aptes à être résolus par récursivité. Je ne vois aucun problème en utilisant la récursivité pour cela.


@Broman unsigned int sum (unsigned int a, unsigned int b) {if (b == 0) return a; retourne la somme (++ a, --b); } ;)


@Calvin Si l'une des questions a résolu votre problème, vous devez l'accepter .


3 Réponses :


6
votes

Votre point de départ pour la fonction est incorrect:

if (Pal(s, 0, strlen(s)-1 ))

Les tableaux en C et C ++ ont un index de départ de 0. Vous commencez donc au deuxième caractère et vous finissez à l'octet de fin nul à la fin de la chaîne.

Utilisez une valeur de 1 en moins pour le début et la fin:

if (Pal(s , 1 ,strlen(s) ))


0 commentaires

1
votes

Utilisez le code suivant:

char string[]={'c,'i','v','i','c'};  //size=5
// indexes:     0  1   2   3   4

Quelques points à considérer

  1. les tableaux de caractères sont utilisés pour la chaîne en C.
  2. Les tableaux en C ont un index de départ de 0 retour
  3. Les tableaux dans C endIndex ont une taille - 1 .

Autres améliorations possibles, bien qu'elles soient très mineures:

  1. Avoir returnType de fonction récursive comme booléen (moindre mémoire).
  2. Donnez des noms plus clairs aux membres de données.

Exemple :

bool isPalindrome(char *str, int startIndex, int endIndex)
{
  if ( startIndex >= endIndex)
    return true;

  if (str[startIndex] != str[endIndex])
    return false;

  return isPalindrome(str, ++startIndex , --endIndex);
} 
int main()
{
  char *str = "civic";

  if (isPalindrome(str , 0, strlen(str)-1))
    printf("YES\n");
  else
    printf("No\n");
}


0 commentaires

0
votes

Le caractère à la position strlen (s) n'est pas le dernier caractère de la chaîne , mais le caractère \ 0 qui marque sa fin . Si vous voulez vérifier par rapport au dernier, remplacez

    if (Pal(s , 0, strlen(s)-1))

par

    if (Pal(s , 1, strlen(s)))

(mais veillez à vérifier d'abord que la chaîne s a au moins un caractère, ou l'expression sera erronée --- vous ne pouvez pas vérifier le palindrome une chaîne vide ---)

Les indices de chaîne vont de 0 code> à un caractère inférieur à strlen(s).


0 commentaires