递归回文测试

时间:2013-02-04 06:56:11

标签: c++ recursion character-arrays

我有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;
}

但似乎只测试第一个字符是否与最后一个字符相同。我想这是因为我的数组(起始点)没有递增但我不确定为什么。

4 个答案:

答案 0 :(得分:4)

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.
}

答案 1 :(得分:4)

我想这可能是由于对if语句的一些根深蒂固的厌恶,但如果由我来决定,我想我会编写类似这样的代码:

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

答案 2 :(得分:1)

你检查第一个和最后一个字符,所以你应该将长度减少2,而不是减少1.此外,你应该返回内部朋友电话的值,而不是把它扔掉。

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

长度为> = 2且str不为空的附加测试也将按顺序进行。

答案 3 :(得分:1)

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

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

应该是:

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

您还需要检查零长度字符串或仅包含单个字符的字符串。