2014-10-17 59 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

相關問題