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

问题描述 投票:3回答:3

由于某些原因,我的回文功能不起作用,我会喜欢它的一些帮助:

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

它继续打印否,我对为什么会发生这种情况一无所知。

c recursion palindrome
3个回答
6
投票

你是函数不正确的起点:

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

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

开头和结尾都使用1的值:

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

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 endIndex中的数组大小为1。

其他改进可能,虽然它们很小:

  1. 返回类型的递归函数为boolean(较小的内存)。
  2. 为数据成员提供更清晰的名称。

例:

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

0
投票

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

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

通过

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

(但要注意首先检查字符串s是否至少有一个字符,否则表达式将是错误的 - 你无法检查回文中的空字符串---)

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

© www.soinside.com 2019 - 2024. All rights reserved.