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

string reverse(string s,int length,int start=0){

    if (start>=length){
        return s;
    }
    else{
        char temp=s[length];
        s[length]=s[start];
        s[start]=temp;
        reverse(s,--length,++start);
    }return s;
}

int main(void) {

    string a;cout<<"enter a string:";getline(cin,a);
    cout<<reverse(a,a.length()-1,0);
}
0
noobkid 5 Мар 2015 в 00:19

2 ответа

Лучший ответ

Вам необходимо передать строку по ссылке, а не по значению в функции reverse:

string reverse(string& s,int length,int start=0){

Живой пример: http://ideone.com/pJ3G9l

Причина, по которой ссылка работает, заключается в том, что вы меняете текущую строку, а не временную строку.

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

string reverse_helper(string& s,int length,int start)
{
    if (start>=length)
        return s;
    else
    {
        char temp=s[length];
        s[length]=s[start];
        s[start]=temp;
        reverse_helper(s,--length,++start);
    }
    return s;
}

string reverse(string str, int length, int start=0)
{
    return reverse_helper(str, length, start);
}

Живой пример вспомогательной функции: http://ideone.com/RzY1Bu

1
PaulMcKenzie 4 Мар 2015 в 21:33

Вместо возврата s, который является копией исходной строки с переключенными первым и последним символами, вам нужно вернуть следующий вызов reverse():

else{
    //...
    return reverse( s, --length, ++start );
}
3
clcto 4 Мар 2015 в 21:23