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

3

当我尝试使用递归来反转数组时遇到了一些问题。这是函数原型:

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个回答

6

你的代码几乎正确,唯一的问题是缩小数组时只从后面缩小而不是从两端缩小。

递归调用应该像这样:

rReverseAr(ar + 1, size - 2);

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


好的,非常感谢!它有效了!不过,我能知道为什么每次递归时,您都会增加数组元素位置,同时将数组大小减去2吗?我的意思是,+1和-2如何限制仅从后面缩小数组? - QWERTY
1
@Denise 每个递归调用将“子数组”传递到下一级。这个子数组从初始元素的下一个元素开始(即在指针算术语法中为ar+1,或在数组索引语法中为&ar[1])。子数组的大小比原始数组的大小小2,因为已经处理了初始和最后的元素。 - Sergey Kalinichenko
我明白了,非常感谢你的帮助! - QWERTY

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接