2017-08-04 70 views
-1
#include<iostream> 
#include<string.h> 
using namespace std; 

//交换功能来交换字符的字符串这个简单的C++递归函数反转字符串有什么问题?

void swap(char &x,char &y){ 
    char temp; 
    temp=x; 
    x=y; 
    y=temp; 
} 

//递归函数扭转串

string reverse(string s,int be,int en){ 
    //base case 
    if(be>=en){ 
     return s ; 
    } 
    //working 
    swap(s[be],s[en]); 
    reverse(s,be+1,en-1); 
} 
int main(){ 
    string s,s1,s2; 
    cin>>s; 
    s1=s; 
    int l=s.length(); 

    s2=reverse(s,0,l-1); 

//检查是否反向串是相同原始字符串

if (s1==s2) 
    { 
     cout<<"true"<<endl; 
    } 
    else{ 
     cout<<"false"<<endl; 
    } 
    return 0; 
} 
+4

这听起来像你可能需要学习如何使用调试器来遍历代码。使用一个好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏离的位置。如果你打算做任何编程,这是一个重要的工具。进一步阅读:[如何调试小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – NathanOliver

+3

此外,如果您的编译器未正确警告您'reverse'()无法返回值,找一个更好的C++编译器。你的代码是未定义的行为,并且每个自尊的C++编译器至少应该发出一个非常响亮,令人厌恶的投诉。 –

+2

您需要'返回反向(s,be + 1,en-1);',不仅仅是调用它 - 这样您将结果传递回堆栈。 – hnefatl

回答

0

这是问题:

string reverse(string s,int be,int en){ 
     if(be>=en){ 
      return s ; 
     } 
     swap(s[be],s[en]); 
     reverse(s,be+1,en-1); 
>  RETURN WHAT? 
    } 

    s2 = reverse(s,0,l-1); // Return value is gone??? 

您的string reverse(string, int, int);没有返回值。当其返回值分配给s2时,我们无法确定实际发生的情况。这是一个UB。

为了解决这个问题,只需返回反转字符串:

 swap(s[be],s[en]); 
>  return reverse(s,be+1,en-1); 
    } 
-1

你是按值传递的字符串,所以它被复制,然后将复制的字符进行交换,但原始字符串保持不变。通过引用传递字符串并将void作为返回类型或使该函数实际返回字符串。

通过参考与通过版本:

void reverse(string& s,int be,int en){ 
    //base case 
    if(be>=en){ 
     return; 
    } 
    swap(s[be],s[en]); 
    reverse(s,be+1,en-1); 
} 

版与字符串作为返回类型和由值传递:

string reverse(string s,int be,int en){ 
     //base case 
     if(be>=en){ 
      return s; 
     } 
     swap(s[be],s[en]); 
     return reverse(temp,be+1,en-1); 
    } 

后者版本粘到的原则宁愿在输出参数返回,但前者可以防止不必要的多个副本,所以在这种情况下,如果您不想重写该函数以便它不递归,那么我会坚持前者,因为对于字符串n,您必须制作n/2个副本,这是很多的(考虑一个例如是千字符长 - 复制500次只是为了扭转它只是听起来不对)。

+0

它以什么方式“毁掉”它?在将字符串传递给函数之前复制该字符串就足够了。 – KjMag

+0

抱歉,我查看了错误的代码。但是,这仍不是一个好习惯。 – iBug

+0

没问题。如果这是你倒退的原因,我会很高兴收回它; p – KjMag

0

您需要返回反方向(S,是+ 1,EN-1),而不是调用它

而且也没有必要有一个额外的字符串s

下面的代码为我工作:

#include<iostream> 
#include<string.h> 
using namespace std; 

void swap(char& x,char& y){ 
    char temp = x; 
    x = y; 
    y = temp; 
} 

string reverse(string s,int be,int en){ 
    //base case 
    if(be >= en){ 
     return s; 
    } 
    //working 
    swap(s[be],s[en]); 

    **return reverse(s, be+1, en-1);** 
} 

int main(){ 

    string s1,s2; 

    cout << "what is your string?" << endl; 
    cin >> s1; 

    int l = s1.length(); 

    s2 = reverse(s1,0,l-1); 

    if (s1==s2){ 
     cout << "true" << endl; 
    } else { 
     cout << "false" << endl; 
    } 
    return 0; 
}