为什么我的回文函数不起作用?

Why is my palindrome function not working?

出于某种原因,我的回文函数无法正常工作,我希望得到一些帮助:

代码

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");
}

需要考虑的几点

  1. 字符数组用于 C 中的字符串。
  2. C 中的数组的 起始索引 0
  3. C 中的数组 endIndexsize - 1.

其他可能的改进,尽管它们非常小:

  1. 将递归函数的 returnType 作为布尔值(较少内存)。
  2. 数据成员的名称更清晰。

示例:

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

位置 strlen(s) 的字符不是字符串中的最后一个字符 ,而是标记其结束的 [=13=] 字符。如果你想检查最后一个,改变

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

来自

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

(但要注意先检查字符串s至少有一个字符,否则表达式会出错---空字符串不能检查回文---)

字符串索引从 0 到小于 strlen(s) 的一个字符。