递归反转数组

Recursively reverse an array

本文关键字:数组 递归      更新时间:2023-10-16

我正在尝试递归反转数组的元素。我在函数中唯一可以拥有的参数是数组和大小。这就是我到目前为止所做的,但在交换时遇到麻烦。如何修复我的输出? 例如,当我输入 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]<<"  ";}
}

总是交换第一个和最后一个元素不会做你想要的。如果您的数组最初是1 2 3 4 5的,下面是每个递归步骤的交换顺序:

  • 交换045 2 3 4 1
  • 交换034 2 3 5 1
  • 交换023 2 4 5 1
  • 交换012 3 4 5 1

在递归算法中,每个递归步骤都应该在较小的数据集上解决相同的问题,并将其与我们迄今为止所做的结合起来,以更接近所需的结果。但是,交换第一个和最后一个只有在它们与原始顺序相同时才是正确的,而在每个步骤之后都不正确。

交换数组的第一个和最后一个元素后,您需要在数组的中间递归,而不仅仅是带有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);
}
}
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);
}
}

我将传递startend索引并使用:

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);  
}

逻辑很简单,将 arr[start] 与 arr[end] 交换,然后递归调用 reverse 来处理数组的其余部分。

如果您想仅通过传递大小来执行此操作:

void reverseArray(int a[],int size)
{
if (size > 1)
{    
//swapping
int temp = a[0]; 
a[0]= a[size-1]; 
a[size-1]= temp;
reverseArray(a+1, size-2);
}
}