使用递归找到回文字符串?

时间:2017-03-21 03:38:04

标签: c++ recursion

bool palindrome(char input[], int siz, int start){
    // siz = size of the array ,start =starting point of the array ie 0
    if(input[start] == '\0') {
        return true;
    } else if(input[start] == input[siz - start - 1]) {
        return true;
        palindrome(input, siz, start + 1);
    } else {
        return false; 
    }
}

我正在尝试使用此递归函数找到回文字符串,但代码将术语alia输出为回文,就好像它只检查字符串的第一个和最后一个字母表一样。 我采用的基本情况是在数组的开头找到null元素然后返回true。 否则,如果第一个和最后一个元素相等,则返回true,并递归调用palindrome(input,siz,start+1),否则返回false。

2 个答案:

答案 0 :(得分:1)

您的问题是您在再次执行之前退出该功能。 现在你有

else if(input[start]==input[siz-start-1])
        {
            return true;
            palindrome(input,siz,start+1);
        }

相反,请尝试

else if(input[start]==input[siz-start-1])
        {
            palindrome(input,siz,start+1);
        }

然后在功能结束时,添加

return true;

编辑:

我测试了它,它对我来说很好,这是完整的代码:

#include <iostream>
bool palindrome(char input[],int siz,int start){
    //siz =size of the array ,start =starting point of the array ie 0
    if(input[start]=='\0')
    {
        return true;
    }
    else if(input[start]==input[siz-start-1])
    {
        palindrome(input,siz,start+1);
    }
    else
    {
        return false;
    }
    return true;
}
int main()
{
    char racecar[] = "racecar";
    if (palindrome(racecar, 7, 0))
    {
        std::cout << "It's a palindrome!" << std::endl;
    }
    else
    {
        std::cout << "It's not a palindrome." << std::endl;
    }
    char abba[] = "abba";
    if (palindrome(abba, 4, 0))
    {
        std::cout << "It's a palindrome!" << std::endl;
    }
    else
    {
        std::cout << "It's not a palindrome." << std::endl;
    }
    return 0;
}

答案 1 :(得分:0)

这可以工作:

#include <iostream>

bool isPalindromeRecursive(char* string, int begin, int end)
{
    if (begin == strlen(string) / 2) // There is no point in comparing chars past half of the string lenght
    {
        return true;
    }
    // Is the first char the same as the last char? <-- we call recursion based on that statement
    return tolower(string[begin]) == tolower(string[end]) && isPalindromeRecursive(string, ++begin, --end);
}
bool isPalindrome(char* string)
{
    return isPalindromeRecursive(string, 0, strlen(string)-1); // Let's  ignore the null char (strlen(string)-1)
}


int main()
{
    std::cout << isPalindrome("hooh") << std::endl;
}