0

再帰についての理解を深めるために、再帰関数を使用して文字列を逆にしようとしています。これは、今の私にとってよりも単純なはずです。私が間違っていることを誰かに教えてもらえますか。以下のコードを実行すると、空白行になります。私はここで同様のトピックを探しましたが、すべてが他の言語で書かれています...驚いたことに.

#include <iostream>
#include <string>

using namespace std;


/**
    Recursivly reverses a string
    @param return last_char, the last character currently in the string
    @param go, the recursive function to return the character and continue     within the function
    **/
char string_reverse(string word)
{

    if (word.length()-1 > 0)
    {
    char last_char = word[word.length()-1];
    word.erase(word.length()-1);
    char go = string_reverse(word);
    return go;

    }

else 
    return false;

}


int main()
{
cout << "Enter a string: ";
string input;
getline(cin, input);
string last;
last = last + string_reverse(input);
cout << last << endl;

/*char fig = string_reverse(input, fig);
cout << fig << endl;
*/

system("pause");
return 0;
}
4

7 に答える 7

3

では、 ++string_reverseを返す必要があります。last characterstring_reverse(word)first character

else入力エラーが発生しないように、 で空の文字列を返します。

関数を呼び出すときは、他に何もせずword、単に呼び出すだけですstring_reverse(word)

すべてをまとめるには:

#include <iostream>
#include <string>

using namespace std;


/**
    Recursivly reverses a string
    @param return last_char, the last character currently in the string
    @param go, the recursive function to return the character and continue
    within the function
    **/
string string_reverse(string word)
{

    if (word.length()-1 > 0)
    {
    string first_char = word.substr(0,1);
    string last_char = word.substr(word.size()-1,1);
    string middle = word.substr(1, word.size()-2);
    return last_char + string_reverse(middle) + first_char;

    }

else 
    return "";

}


int main()
{
cout << "Enter a string: ";
string input;
getline(cin, input);
cout << string_reverse(input); << endl;

system("pause");
return 0;
}

ただし、これは奇数の文字数では失敗します。「c」は「cc」を出力します。それはあなたに任せます。

于 2013-03-29T13:55:37.233 に答える
2

string_reverse()戻りますchar。単一の を使用して文字列の逆を返すことはおそらくできませんchar

その上、ロジックstring_reverse()は、文字列の反転に近づくようなことを行うにはほど遠いものです

于 2013-03-29T13:55:14.170 に答える
2

文字列を返す必要があります。また、抽出された文字を戻り値の前に追加する必要があります

string string_reverse(string word)
{
    if (word.length() - 1 > 0)
    {
        char last_char = word[word.length()-1];
        word.erase(word.length()-1);
        string go = string_reverse(word);
        return go.insert(0, 1, last_char);
    }
    else
        return "";
}
于 2013-03-29T13:59:27.633 に答える
0

文字列を返す場合、取得できる最短バージョンは次のようになります。

std::string string_reverse(const std::string& str)
{
  return str.size() > 1? string_reverse(str.substr(1)) + str[0] : str;
}
于 2014-02-09T18:13:19.407 に答える
0

上記の回答の1つを微調整して、偶数または奇数の長さの文字列を処理します。

string reverse (string str)
{

if (str.length() == 0)
    return "";
else
    if (str.length() == 1)
        return str.substr(0,1);
    else
    {
        string first_char = str.substr(0,1);
        string last_char = str.substr(str.size()-1,1);
        string middle = str.substr(1, str.size()-2);
        return last_char + reverse(middle) + first_char;
    }
 }

長さ 0 の文字列と長さ 1 の文字列は、それぞれ再帰ケースとは別に処理する必要があります。

于 2015-04-08T20:42:34.767 に答える
0

あなたのリバースボディはまったく機能しません。逆の考え方は次のとおりです。

If the string len is 1, return it.
Otherwise,
   Remove the first character.
   Recursively reverse the remaining string.
   Add the first character above to the reversed string.
   Return the new string.
于 2013-03-29T14:13:53.410 に答える