C ++: перевернуть строку с помощью рекурсии - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь изменить строку, передавая ее по ссылке путем обращения к ней например: слово «дельфин» в том смысле, что это nihplod с использованием только рекурсии. Я не могу добавить больше параметров для функции изменения заголовка. Мой вывод сейчас od вместо дельфин , я думаю, что он делает только последние две буквы, я, честно говоря, не знаю почему. Любая вещь, которую я должен изменить? Вот мой код.

void reverse(string &word) {
    if (word.length() == 1 || word.length() == 0) {
        if (word.length() == 1) {
            word = word;
        }
        else if (word.length() == 0) {
            word = "nothing to reverse";
        }
    }
    else {
        string temp;
        if (temp.length() == 0) {
            temp = "";
            temp = temp+word.substr(word.length() - 1, 1);
            word.pop_back();
            if (word.length() == 0) {
                word = temp;
            }
            else if (word.length() == 1) {
                //temp = temp + word.substr(word.length() - 1, 1);
                temp = temp + word;
                word.pop_back();
                word = temp;
            }
            else {
                reverse(word);
            }
        }
        else {
            temp = temp + word.substr(word.length() - 1, 1);
            word.pop_back();
            if (word.length() == 0) {
                word = temp;
            }
            else if (word.length() == 1) {
                //temp = temp + word.substr(word.length() - 1, 1);
                temp = temp + word;
                word.pop_back();
                word = temp;
            }
            else {
                reverse(temp);
            }

        }
    }


}

Ответы [ 3 ]

0 голосов
/ 18 марта 2019

Алгоритм такой:

  • Если длина строки меньше 2, просто верните
  • уберите первый и последний символы слова, чтобы создать подстроку
  • рекурсивно вызовите reverse на вашей подстроке
  • После возвращения из рекурсии, префикс исходного «последнего символа» и постфикс исходного «первого символа» завершают строку

Вот, пожалуйста,

void reverse(string& word)
{
    size_t len = word.size();

    if (len < 2)
    {
        return;
    }

    char first = word[0];
    char last = word[len - 1];
    string inner;

    if (len > 2)
    {
        inner = word.substr(1, len - 2);
        reverse(inner);
    }
    word = last + inner + first;
}
0 голосов
/ 18 марта 2019

Не рекурсивным способом достижения того же самого может быть:

void reverseString(std::string& input)
{
    const size_t inputStringLength = input.size();
    for (size_t index = 0; index < inputStringLength/2; ++index)
    {
        // swap the character at "index" position with the character at "inputStringLength - index - 1" position
        input[index] ^= input[inputStringLength - index - 1] ^= input[index] ^= input[inputStringLength - index - 1];
    }
}
0 голосов
/ 18 марта 2019
void reverse(string &word) 
{
    string temp = word;
    if(temp.length != 0)
    {
       cout << temp.at(temp.length()-1);
       reverse(temp.erase(temp.length()-1));
    }
    else
       cout << "\ndone\n";
}

Это напечатает в обратном порядке и не изменит исходную строку, которая была передана. Если вы хотите изменить исходную строку, просто удалите переменную temp.

...