【问题标题】:Recursive Palindrome Test递归回文检验
【发布时间】:2013-02-04 06:56:10
【问题描述】:

我的原型限制为bool pal(char str[], int length),我需要测试用户输入的字符串是否为回文。我的代码是:

bool pal(char str[], int length)
{
    if(*str == str[length - 1])
    {
        pal(str+1, length-1);
    }
    else
    {
        return false
    }
    return true;
}

但它似乎只测试第一个字符是否与最后一个字符相同。我认为这是因为我的数组(起点)没有增加,但我不知道为什么。

【问题讨论】:

  • 请粘贴您的实际代码——这看起来甚至不应该编译(例如,*pal == pal[length - 1] 无疑应该是*str == str[length - 1])。
  • 你忘记了你删掉的多余字符。

标签: c++ recursion character-arrays


【解决方案1】:

我想这可能是由于对if 声明的一些根深蒂固的厌恶,但如果由我决定,我想我会编写如下代码:

bool pal(char *str, size_t len) { 
    return len <2 || (str[0] == str[len-1] && pal(str+1, len-2));
}

【讨论】:

  • 可能有点问题...我通常尽量不依赖操作数的评估顺序,因为它并不总是显而易见的,而且很容易被没有经验的维护者破坏。
  • @icepack:如果有人不知道||&amp;&amp; 的含义,那么想成为维护者就有点可怕(至少对我而言)。
  • 问题不在于理解||&amp;&amp;的含义,而在于C中的评估顺序。就纯数学而言,如果首先评估左操作数还是先评估右操作数,没有区别。但是,在运行时有很大的不同。您的代码可能是一个简单的示例,但在更复杂的情况下,问题可能并不那么明显......对不起,如果我太挑剔了。顺便说一句:stackoverflow.com/questions/7112282/…
  • @icepack:||&amp;&amp; 都不是数学定义的。它们是 C(和 C++)运算符,任何接触过 C 或 C++ 代码的人都应该知道它们的含义(包括求值顺序)。
  • @icepack:&amp;&amp;|| 的整个 point 是它们的评估顺序。怎么会有人在不知道它们的顺序的情况下故意使用它们?!
【解决方案2】:

Here is a working version of your code.

bool pal(const char* str, int length)
{
   if(length <2) return true; // base case - 1 or 0 length string is a palindrome.
   if((*str) == str[length - 1])
   {
     return pal(str+1, length-2); // -2 because 1 from front and 1 from back. 
   }
   else
   {
     return false;
   }
    //no return here because the recursive call is returned.
}

【讨论】:

    【解决方案3】:

    你的主要问题是你没有对递归调用的结果做任何事情:

     if(*str == str[length - 1])
        {
            pal(str+1, length-1);
        }
    

    应该是:

     if(*str == str[length - 1])
        {
            return pal(str+1, length-1);
        }
    

    您还需要检查诸如零长度字符串或只有单个字符的字符串。

    【讨论】:

    • @icepack:我不同意。对于初始调用,除非第一个和最后一个字符不相等,否则不能返回“false”。在所有其他情况下,“main”调用返回“true”。
    【解决方案4】:

    您检查第一个和最后一个字符,因此您应该将长度减少 2,而不是减少 1。此外,您应该返回内部 pal 调用的值,而不是将其丢弃。

    if(*str == str[length - 1])
    {
        return pal(str + 1, length - 2);
    }
    

    对于长度 >=2 且 str 不为空的额外测试也是必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 2015-07-22
      • 2021-06-30
      • 1970-01-01
      • 2019-01-05
      • 2014-06-21
      • 1970-01-01
      相关资源
      最近更新 更多