我试图以递归方式反转数组的元素。我在函数中可以拥有的唯一参数是数组和大小。这是我到目前为止所做的,但在交换时遇到了麻烦。我该如何修复输出? 例如,当我输入1 2 3时,元素将反转为2 3 1
//Recursive function for Reversing array
void reverse_arr(int a[],int size){
if(size ==0){
return ;
}
else{
int temp;
int i= 0;
temp = a[i];
a[i]= a[size-1];
a[size -1] = temp;
reverse_arr(a, size-1);
}
}
int main() {
int a[100];
int size ;
cout<<"Enter the size of the array: "<<endl;
cin>>size;
cout<<"Enter the elements of the array: "<<endl;
for(int i = 0; i<size; i++){
cin>>a[i]; }
for(int i = 0; i<size; i++){
cout<<a[i]<<" ";}
cout<<endl;
reverse_arr(a, 3);
for(int i = 0; i<size; i++){
cout<<a[i]<<" ";}
}
答案 0 :(得分:2)
void Reverse(int a[], int size)
{
if (size > 1)
{
// Swap the extreme elements
int swap= a[0]; a[0]= a[size-1]; a[size-1]= swap;
// Recurse on the subarray obtained by dropping the extreme elements
Reverse(a+1, size-2);
}
}
答案 1 :(得分:2)
始终交换第一个和最后一个元素并不能做你想做的事情。如果你的数组最初是1 2 3 4 5
,那么这里是每个递归步骤的交换顺序:
0
和4
:5 2 3 4 1
0
和3
:4 2 3 5 1
0
和2
:3 2 4 5 1
0
和1
:2 3 4 5 1
在递归算法中,每个递归步骤都应该在较小的数据集上解决相同的问题,并将其与我们迄今为止所做的相结合,以更接近所需的结果。但是,如果它们与原始顺序相同,那么第一个和最后一个交换是正确的,在每个步骤之后都不是真的。
交换数组的第一个和最后一个元素后,需要递归到数组的 middle ,而不仅仅是size - 1
的同一个数组。所以你需要从第二个元素开始以递归方式调用该函数,并从size
中减去2。
你什么都不做的基本情况应该是size <= 1
,因为当你反转它时,1元素数组是相同的。
//Recursive function for Reversing array
void reverse_arr(int a[],int size){
if(size <= 1 ){
return ;
}
else{
int temp;
int i= 0;
temp = a[i];
a[i]= a[size-1];
a[size -1] = temp;
reverse_arr(&a[1], size-2);
}
}
答案 2 :(得分:1)
我将同时传递View > Developer > Toggle Developer Tools
和start
索引并使用:
end
逻辑很简单,使用arr [end]交换arr [start],然后以递归方式为数组的其余部分调用reverse。
如果你想通过传递大小来做到这一点:
void reverseArray(int arr[], int start, int end)
{
if (start >= end)
return;
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
// Recursive Function calling
reverseArray(arr, start + 1, end - 1);
}