Полученный вами результат неверен, потому что при последнем вызове вашей функции вы возвращаете пустой вектор, а затем вы возвращаете sh в конце этого вектора вашу последнюю пару чисел, инвертированных, поэтому 6,5
, так что вы продолжайте возвращаться в стек вызовов. Давайте посмотрим, что вы имеете при каждом вызове (первый вызов, второй вызов, e cc.):
- v =
[1,2,3,4,5,6]
-> рекурсивный вызов - v =
[3,4,5,6]
-> рекурсивный вызов - v =
[5,6]
-> рекурсивный вызов - v =
[]
-> вернуть пустой вектор - rev =
[]
, pu sh возвращает первые два элемента v в обратном порядке, поэтому rev = [6,5]
-> return rev - rev =
[6,5]
, pu sh возвращает первые два элемента v в обратный порядок, т. е. rev = [6,5,4,3]
-> return rev - rev =
[6,5,4,3]
, pu sh назад первые два элемента v в обратном порядке, т. е. rev = [6,5,4,3,2,1]
По этой причине вам нужно сначала иметь вектор с обратными первыми двумя числами, а затем присоединить обработанный хвост, как предложено выше.
Обратите внимание, что вы создаете копии вектора каждый раз раз вы вызываете функцию. Вы можете создать обратную копию, не изменяя копию аргумента, заданного в качестве аргумента. Вместо этого я бы использовал итераторы, чтобы каждая функция «видела» меньшую часть исходного вектора, не касаясь его. Вот реализация:
vector<int> reverse(vector<int>::const_iterator begin, vector<int>::const_iterator end) {
if (begin==end-1) //the vector has an odd number of elements, let's append the last element
return vector<int>(1, *(end-1));
else if(begin>=end) //the vector has en even number of elements
return vector<int>();
else
{
vector<int> pairWiseReversed({*(begin+1), *begin});
vector<int> tail=reverse(begin+2, end);
pairWiseReversed.insert(pairWiseReversed.end(), tail.begin(), tail.end());
return pairWiseReversed;
}
}
vector<int> buildReversed(const vector<int>& input){
return reverse(input.begin(), input.end());
}
А вот основная:
int main() {
vector<int> v{1,2,3,4,5,6};
cout<<"Input vector"<<endl;
for(auto n:v)
cout<<n<<" ";
cout<<endl;
vector<int> res=buildReversed(v);
cout<<"Output vector"<<endl;
for(auto n:res)
cout<<n<<" ";
cout<<endl;
return 0;
}