2014-10-17 198 views
0

我正在尝试编写一个递归函数,它给出一个字符串,递归计算一个新的字符串,其中所有小写'x'字符都被移动到字符串的末尾。
将特定字符移动到字符串结尾的递归C++函数

例如,
moveXs( “xxre”) - > “REXX”
moveXs( “xxhixx”) - > “hixxxx”
moveXs( “xhixhix”) - > “hihixxx”

我对C++比较陌生,特别是递归(不幸的是函数必须使用这种方法来解决问题),所以我在解决这个问题时遇到了麻烦。下面是我迄今为止编写的代码,但它似乎只返回空字符串,我不能为我的生活找出原因。

string moveXs(const string& str) 
{ 
    string strCopy = str; 
    if (strCopy.length() <= 1) 
    { 
     return str; 
    } 
    else if (strCopy[0] == 'x') 
    { 
     strCopy = strCopy.substr(1, strCopy.length() - 1) + str[0]; 
     return moveXs(strCopy.substr(0, (strCopy.length() - 2))); 
    } 
    else 
    { 
     return strCopy.substr(0, 1) + moveXs(strCopy.substr(1, strCopy.length() - 1)); 
    } 
} 

任何帮助或建议将不胜感激!

回答

2

看起来你只是有一些索引问题。我在这里修改了你的代码,并注意到新的回报。我也摆脱了多余的第二个字符串。

string moveXs(const string& str) 
{ 
    if (str.length() <= 1) 
    { 
     return str; 
    } 
    else if (str[0] == 'x') 
    { 
     return moveXs(str.substr(1, (str.length() - 1))) + str[0]; 
    } 
    else 
    { 
     return str[0] + moveXs(str.substr(1, str.length())); 
    } 
} 

您可以在这里的行动看出来:http://ideone.com/aT75l5

+1

将你的编辑与我的比较,我能够准确地看到我的索引出错了。删除strCopy字符串也使编码器更加清洁。非常感谢你的帮助。 – Nea 2014-10-17 03:18:31

0

一个简单的方法可能只是遍历字符串从开始到结束计数并删除'x'。然后在前面的字符串中附加'x'计数次数。

+0

你应该能够作出这样的尾递归太多,所以它可以被优化掉。 – Baldrickk 2014-10-17 07:19:15

相关问题