Использование функции local static
в рекурсивной функции является плохой идеей. Рекурсивные функции должны получать все свое состояние в качестве входных аргументов.
Вот упрощенная версия, которая делит лог c на две функции.
void ReverseString(string &S, int start, int end)
{
if ( start < end )
{
swap(S[start], S[end - 1]);
ReverseString(S, start+1, end - 1);
}
}
void ReverseString(string &S)
{
ReverseString(S, 0, S.size());
}
В большинстве случаев функции более высокого уровня будут только вызвать вторую функцию. Первая функция может быть вызвана из функции более высокого уровня, если есть необходимость обратить только подмножество строки.
Вот пример программы
#include <iostream>
#include <string>
using namespace std;
void ReverseString(string &S, int start, int end)
{
if ( start < end )
{
swap(S[start], S[end - 1]);
ReverseString(S, start+1, end - 1);
}
}
void ReverseString(string &S)
{
ReverseString(S, 0, S.size());
}
int main()
{
string s = "The string to reverse" ;
cout << "Before Reversing" << endl;
cout << s << endl;
ReverseString(s);
cout << "After Reversing" << endl;
cout << s << endl;
ReverseString(s, 0, 7);
cout << "After Reversing a subset" << endl;
cout << s << endl;
return 0;
}
и ее вывод
Before Reversing
The string to reverse
After Reversing
esrever ot gnirts ehT
After Reversing a subset
reverse ot gnirts ehT
См. Это работает на https://ideone.com/9nMlsP.