由于某些原因,我的回文功能不起作用,我会喜欢它的一些帮助:
码
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");
}
它继续打印否,我对为什么会发生这种情况一无所知。
你是函数不正确的起点:
if (Pal(s , 1 ,strlen(s) ))
C和C ++中的数组的起始索引为0.所以你实际上是从第二个字符开始,到字符串末尾的空终止字节结束。
开头和结尾都使用1的值:
if (Pal(s, 0, strlen(s)-1 ))
使用以下代码:
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");
}
有些要考虑的要点
其他改进可能,虽然它们很小:
例:
char string[]={'c,'i','v','i','c'}; //size=5
// indexes: 0 1 2 3 4
位置strlen(s)
处的字符不是字符串中的最后一个字符,而是标记其结尾的\0
字符。如果要检查最后一个,请更改
if (Pal(s , 1, strlen(s)))
通过
if (Pal(s , 0, strlen(s)-1))
(但要注意首先检查字符串s
是否至少有一个字符,否则表达式将是错误的 - 你无法检查回文中的空字符串---)
字符串索引从0
变为小于strlen(s)
的一个字符。