在C编程中使用递归反转数组

时间:2015-09-26 11:41:21

标签: c arrays recursion reverse

尝试使用递归执行反向数组时遇到了一些问题。这是函数原型:

void rReverseAr(int ar[ ], int size); 

这是我的代码:

int main()
{
    int ar[10], size, i;

    printf("Enter array size: ");
    scanf("%d", &size);
    printf("Enter %d numbers: ", size);
    for (i = 0; i<size; i++)
        scanf("%d", &ar[i]);
    rReverseAr(ar, size);
    printf("rReverseAr(): ");
    for (i = 0; i<size; i++)
        printf("%d ", ar[i]);
    return 0;
}

void rReverseAr(int ar[], int size) {
    int start = 0, end = size - 1, temp;
    if (start < end) {
        temp = ar[start];
        ar[start] = ar[end];
        ar[end] = temp;
        start++;
        end--;

        rReverseAr(ar, size - 1);
    }       
}

预期输出应该是当用户输入1 2 3并且它应该返回3 2 1时。但是,使用这些代码,我得到的输出是2 3 1

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

您的代码几乎是正确的。唯一的问题是,不是从两侧“缩小”阵列,而是仅从后面收缩它。

递归调用应如下所示:

rReverseAr(ar + 1, size - 2);

您无需递增start或递减end,因为修改后不会使用它们的值。

答案 1 :(得分:0)

一种简单的方式:

#include<stdio.h>
using namespace std;

void revs(int i, int n, int arr[])
{
  if(i==n)
  {
    return ;
  }
  else
  {
    revs(i+1, n, arr);
    printf("%d ", arr[i]);
  }
}


int main()
{
  int i, n, arr[10];
  scanf("%d", &n);
  for(i=0; i<n; i++)
  {
      scanf("%d", &arr[i]);
  }
  revs(0, n, arr);

  return 0;
}

在C:link

中使用递归迭代数组

答案 2 :(得分:0)

您正在做的是交换第一个和最后一个元素的值并进行递归。

每次您都应将地址移至下一个元素,作为下一次数组交换的开始。

一种可能的方法:

void rReverseAr(int ar[], int size){
      int buffer=ar[0]; 
      ar[0] = ar[size-1];
      ar[size-1] = buffer;
      if ((size!=2)&&(size!=1)) rReverseAr(ar+1,size-2);
}