【问题标题】:Why is my palindrome function not working?为什么我的回文函数不起作用?
【发布时间】:2019-02-24 15:23:27
【问题描述】:

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

代码

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

它一直打印不,我不知道为什么会这样。

【问题讨论】:

  • 寻找回文不是需要递归的问题。不涉及层次结构,也没有堆栈集合。
  • 不要忘记数组索引是基于的。这意味着由 5 个元素组成的数组的索引从 04(含)。
  • char *s = "civic";的第一个元素是s[0],最后一个(不包括'\0')是s[4]
  • @sturcotte06 很少有问题需要递归,但很多适合用递归解决。我认为使用递归没有任何问题。
  • @Broman unsigned int sum(unsigned int a, unsigned int b) { if (b == 0) return a; return sum(++a, --b); } ;)

标签: c recursion palindrome


【解决方案1】:

你的函数起点不正确:

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

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

开始和结束都使用 1 的值:

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

【讨论】:

    【解决方案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");
    }
    

    需要考虑的几点

    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
    

    【讨论】:

      【解决方案3】:

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

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

      通过

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-23
        • 2021-09-03
        • 2021-03-21
        • 2021-12-18
        • 2011-06-23
        • 1970-01-01
        • 2017-08-18
        • 2010-10-18
        相关资源
        最近更新 更多