为什么我的回文功能不起作用?

时间:2019-02-24 15:23:27

标签: c recursion palindrome

由于某种原因,我的回文功能无法正常工作,我很乐意提供一些帮助:

代码

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 个答案:

答案 0 :(得分:6)

您输入的功能不正确:

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

C和C ++中的数组的起始索引为0。因此,您实际上是从第二个字符开始,到字符串末尾的空终止字节结束。

对于开头和结尾,请使用小于1的值:

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

答案 1 :(得分:1)

使用以下代码:

python -m smtpd -n -c DebuggingServer localhost:1025

需要考虑的几点

  1. 字符数组用于C语言中的字符串。
  2. C中的数组的起始索引 0
  3. C endIndex 中的数组的大小为-1

可能会进行其他改进,尽管这些改进很小:

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

示例:

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

答案 2 :(得分:0)

位置strlen(s) 的字符不是字符串中的最后一个字符,而是标记其结尾的\0字符。如果要检查最后一个,请更改

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

作者

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

(但是请务必先检查字符串s是否至少包含一个字符,否则表达式将是错误的---您不能为回文检查是否为空字符串---)

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