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!
s
doit êtrechar const *
à la fois dansmain ()
et comme paramètre dePal ()
.int main ()
doit êtreint main (void)
si cela est supposé êtreC
et nonC ++
.dans l'appel récursif, vous pouvez simplement écrire
return Pal (s, a + 1, b-1);
, vous n'avez pas besoin de changera
etb
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 .