Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;算法简单的递归回文检查器_C++_Recursion - Fatal编程技术网

C++ C++;算法简单的递归回文检查器

C++ C++;算法简单的递归回文检查器,c++,recursion,C++,Recursion,我写了一个字符串回文检查器,我的导师说它比需要的复杂。我读过类似的文章,也在谷歌上搜索过,但我完全不知道如何让它以比这更少的步骤工作 void isPal(string str){ int length = str.length(); if(length <= 1) cout << "Palindrome" << endl;//check for zero or one digit numbers else if(str.at(0) == str.at(length

我写了一个字符串回文检查器,我的导师说它比需要的复杂。我读过类似的文章,也在谷歌上搜索过,但我完全不知道如何让它以比这更少的步骤工作

void isPal(string str){
int length = str.length();
if(length <= 1) cout << "Palindrome" << endl;//check for zero or one digit numbers
else if(str.at(0) == str.at(length -1)) {
    str = str.substr(1, (length - 2));
    isPal(str);}
else cout << "Not a palindrome." << endl;{
    cin >> str;}
void isPal(字符串str){
int length=str.length();

如果(长度Hmm)使其不递归是一种尝试

int i = 0;
int j = str.length() - 1;
bool isPalindrome = true;

while(i < j && isPalindrome)
{
   if(str[i++] != str[j--]) isPalindrome = false;
}
inti=0;
int j=str.length()-1;
bool isPalindrome=true;
while(i)isAlindrome=false;
}
检查以下内容:

int is_pal(int start, int end, string &str)
{
    if (start >= end)
        return 1;
    if (str[start] != str[end])
        return 0;
    return is_pal(++start, --end, str);   
}
从main调用该方法。如果有帮助,请告诉我。:)

使用递归 如果仍要使用递归,请执行以下操作:

bool isPal(const string &str, int start, int end)
{
    if (start >= end)   
        return true;
    if (str[start] != str[end])
        return false;
    return isPal(str, ++start, --end);   
}
并在主体中调用
isPal(str,0,str.length()-1)
。其思想是使用两个索引并移动它们,因为在递归中每次都不想使用
substr()

无递归 实际上,这个问题很容易解决,无需使用递归,如下所示:

bool isPal(const string &str)
{
    int start=0, end=str.length()-1;
    while (start < end) {
        if (str[start++] != str[end--]) 
            return false;
    }
    return true;
}
bool isPal(常量字符串和str)
{
int start=0,end=str.length()-1;
while(开始<结束){
如果(str[start++]!=str[end--])
返回false;
}
返回true;
}

它应该是一个返回true或false的函数,而不是打印消息。参数应该是单个字符串对象

bool isPalindrome( const std::string & word ){
  std::string::const_iterator fwd = word.begin();
  std::string::const_iterator rev = word.end();
  if( rev - fwd <= 1 ) return true;
  if( *fwd++ != *--rev ) return false;
  return isPalindrome( std::string( fwd, rev ) );
}
不是很讨人喜欢,是吗?-但一个人可以做得更好

bool isPal2( string::const_iterator fwd, string::const_iterator rev ){
    return rev - fwd <= 1 || *fwd++ == *--rev && isPal2( fwd, rev );
}

现在,我们已经避免了创建字符串对象,即使是在回文或“回文类”的罕见情况下,也只需要一个额外的参数,至少没有冗余信息。

如果您试图检查字符串是否为回文,您可以通过以下方式轻松完成:

  • 将字符串插入到向量中
  • 反转向量v并将其插入另一个称为“假设v1”的向量
  • 如果v==v1,则为回文,否则为非回文


  • 我刚刚建议了一种检查回文的方法。没有别的。

    你应该把字符串一分为二并进行比较?一起使用两个索引,你不想使用.substr。@elmigranto这个问题的任务是使用递归。否则我可以将整个字符串与其相反的字符串进行比较,对吗?@herohuyongtao我是否在不使用.substr的情况下删除了第一个和最后一个字符?@brock是的,正确。
    std::equal(s.cbegin()、s.cend()、s.crbegin())谢谢,但我应该在这个问题上使用递归。哈哈,np。看起来另一个答案是递归等价的。我不得不用
    字符串str
    替换
    char*str
    ,但这很有效。谢谢。这不是“算法简单”因为它要求调用方在调用中添加两个索引值。@elmigranto如果您不理解,请不要编辑它。最好通过常量引用传递字符串:P@Drongo有趣的是,这个问题现在有超过10000个视图,但它和公认的答案(你的)都没有请原谅,我不理解参数
    string&word
    @brock这是通过引用传递参数的表示法。在C语言中,必须在参数规范中使用“type*par”,在调用中使用“&variable”,在函数体中使用“*par”来实现(或多或少)相同的效果。可怕的
    O(n^2)
    算法,因为它为每个pass@Alnitak我相信您可以向我们展示一个算法简单的递归版本,即单个函数,签名如问题所示。好的(除了返回与消息问题)你的函数在功能上相当于OP发布的那篇他说不够好的文章-都创建了一个新的stringNeed…更多…向量…:)只需使用
    std::equal
    和反向迭代器。通过在循环中调用
    strlen()
    ,你就得到了算法O(n^2)而不是O(n)只提供代码而没有解释的答案不是特别有用欢迎使用stackoverflow!虽然此代码块可能会回答此问题,但您应该尝试使用代码的相关解释来改进您的答案。如果您修复此问题以对字符串使用常量引用,请参阅我将向上投票parameters@Alnitak修正了,谢谢你的广告恶习
    bool isPalindrome(char str[], int i) {
    
        int x=(strlen(str)-i);
           if (i==0) {
          return true;
       }
       if (str[x]!=str[i-1]) {
          return false;
       }
       return isPalindrome(str, i-1);
    }
    
    string word = "reviver";
    bool res = isPal2( word.begin(), word.end() );
    
    bool isPalindrome(char str[], int i) {
    
        int x=(strlen(str)-i);
           if (i==0) {
          return true;
       }
       if (str[x]!=str[i-1]) {
          return false;
       }
       return isPalindrome(str, i-1);
    }