递归反转数组

时间:2018-04-19 21:08:52

标签: c++ recursion

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

3 个答案:

答案 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,那么这里是每个递归步骤的交换顺序:

  • 交换045 2 3 4 1
  • 交换034 2 3 5 1
  • 交换023 2 4 5 1
  • 交换012 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 Toolsstart索引并使用:

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