Рекурсивное обращение строки без параметров - PullRequest
0 голосов
/ 05 февраля 2020

Мне дали класс smartReverse, который содержит один элемент данных, который является строкой с именем str. Я должен реализовать метод-член (без какой-либо вспомогательной функции, которая не принимает никаких параметров и возвращает обратную версию str.

Пока это моя попытка, но она ничего не делает, только отправляет первый символ в конец этой строки. И с этого момента я довольно невежественен. Я знаю, как сделать это, используя вспомогательную функцию, но мне здесь запрещено использовать их.

string smartReverse::rev_recursive() const
{
        if (str.length() <= 1)
                return str;
        char first_char = str[0];
        smartReverse* remainder = new smartReverse(str.substr(1));
        remainder->rev_recursive();
        return remainder->getString() + first_char;
}

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Нет необходимости динамически выделять объект типа std :: string. Это просто плохая идея.

Я не знаю, как выглядит класс smartReverse, но вот его упрощенная версия, которая имеет только одну функцию-член rev_recursive, которая переворачивает сохраненную строку.

#include <iostream>
#include <string>

class smartReverse
{
public:
    smartReverse( const std::string &s ) : s( s ) {}

    std::string rev_recursive() 
    {
        if ( s.size() < 2 ) return s;

        char first = s.front(), last = s.back();

        s = s.substr( 1, s.size() - 2 );
        return s = last + rev_recursive() + first;
    }
private:
    std::string s;
};  

int main() 
{
    smartReverse obj( "Hello Brennen Green" );

    std::cout << obj.rev_recursive() << '\n';

    return 0;
}

Вывод программы:

neerG nennerB olleH

Если функция должна быть функцией-постоянным членом, ее реализация может выглядеть следующим образом

#include <iostream>
#include <string>

class smartReverse
{
public:
    smartReverse( const std::string &s ) : s( s ) {}

    std::string getString() const
    {
        return s;
    }

    std::string rev_recursive() const
    {
        if ( s.size() < 2 ) return s;

        char first = s.front(), last = s.back();

        return last + smartReverse( s.substr( 1, s.size() - 2 ) ).rev_recursive() + first;
    }

private:
    std::string s;
};  

int main() 
{
    smartReverse obj( "Hello Brennen Green" );

    std::cout << obj.getString() << '\n';
    std::cout << obj.rev_recursive() << '\n';

    return 0;
}

Вывод программы:

Hello Brennen Green
neerG nennerB olleH

Обратите внимание на то, что используемый подход более эффективен, чем когда только один символ удаляется из начала строки и затем добавляется в конец, потому что в используемом подходе число рекурсий меньше или равно s.size() / 2 исходной строки.

0 голосов
/ 05 февраля 2020

При удалении memleak и использовании результата rev_recursive фиксированная версия может быть:

std::string smartReverse::rev_recursive() const
{
    if (str.length() <= 1) {
        return str;
    }
    char first_char = str[0];
    smartReverse remainder(str.substr(1));
    return remainder.rev_recursive() + first_char;
}
...