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");
}
3 Réponses :
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) ))
Utilisez le code suivant:
char string[]={'c,'i','v','i','c'}; //size=5
// indexes: 0 1 2 3 4
Quelques points à considérer
Autres améliorations possibles, bien qu'elles soient très mineures:
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");
}
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).
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";ests [0], le dernier (sans compter le'\ 0') ests [4].Essayez
Pal (s, 0, strlen (s) -1)problème résolu, merci à tous!
sdoit êtrechar const *à la fois dansmain ()et comme paramètre dePal ().int main ()doit êtreint main (void)si cela est supposé êtreCet nonC ++.dans l'appel récursif, vous pouvez simplement écrire
return Pal (s, a + 1, b-1);, vous n'avez pas besoin de changeraetblui-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 .