使用递归函数查找String Palindrome

时间:2014-04-06 06:56:50

标签: c++ recursion palindrome

我正在尝试编写一个递归函数来确定字符串是否是回文。以下是我到目前为止的情况:

int main()
{
    string word = "madam";

    if (palindrome(word) == true)
        cout << "word is a palindrome!" << endl;
    else
        cout << "word is not a palindrome..." << endl;

    return 0;
}

bool palindrome(string word)
{
    int length = word.length();

    string first = word.substr(0,1);
    string last = word.substr((length - 1), 1);

    if (first == last)
    {
        word = word.substr((0 + 1), (length - 2));
        cout << word << " " << word.length() << endl;  // DEBUGGING
        if (word.length() <= 1) return true;  // Problem line?
        palindrome(word);
    }
    else
        return false;
}

由于某种原因,当递归函数变得足够深,并且word.length()小于或等于1时,它不会返回true。我似乎无法弄清楚原因。它是否与递归函数的工作方式有关,或者在我评论DEBUGGING之前我如何重新调整行中的单词长度?

我在C ++方面并不像我应该那样有天赋,所以如果我的编程看起来很差,请原谅。

3 个答案:

答案 0 :(得分:3)

你至少错过了一个返回声明:

    if (word.length() <= 1) return true;  // Problem line?
    return palindrome(word);    // ###### HERE !
}
else
    return false;

如果长度不是1,则递归调用palindrome函数,忽略其返回值,然后始终返回false。通过我的修复,您将在删除第一个和最后一个字母后返回使用word调用的回文函数的结果。

答案 1 :(得分:1)

answer by hivert确定了您的问题但是如果您完全关注性能,请考虑使用迭代器或索引而不是制作许多字符串副本。也许是这样的事情:

#include <iostream>

template <typename T>
bool palindrome(T begin, T end){
  if (end - begin <= 1 )
    return true;

  --end;
  if (*begin != *end)
    return false;

  ++begin;
  return palindrome(begin, end);
}

int main() {
  std::string word(10000,'a');

  if (palindrome(word.cbegin(), word.cend()) == true)
    std::cout << "word is a palindrome" << std::endl;
  else
    std::cout << "word is not a palindrome" << std::endl;
}

但是如果你想检查一个很长的字符串,你可能会得到一个堆栈溢出。如果幸运的话,编译器可能会执行tail call optimization。当然,在这种情况下,很容易删除递归并改为使用循环:

#include <iostream>

template <typename T>
bool palindrome(T begin, T end){
  while(end - begin > 1) {
    --end;  
   if (*begin != *end)
      return false;
    ++begin;
  }
  return true;
}

int main() {
  std::string word(1000000000,'a');

  if (palindrome(word.cbegin(), word.cend()) == true)
    std::cout << "word is a palindrome" << std::endl;
  else
    std::cout << "word is not a palindrome" << std::endl;
}

答案 2 :(得分:-1)

 string palindrome(string a, string b)
  {
    if (a.length() == 1 && a == b)
    return "true";
    else if (a.substr(0, 1) == b.substr(b.length() - 1, b.length() - 1)) return palindrome(a.substr(1), b.substr(0, b.length() - 1));
    else return "false";
  }