我正在尝试编写一个递归函数来确定字符串是否是回文。以下是我到目前为止的情况:
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 ++方面并不像我应该那样有天赋,所以如果我的编程看起来很差,请原谅。
答案 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";
}