在C中使用递归反转int数组

时间:2015-07-03 12:07:27

标签: c arrays pointers recursion reversing

我在学校学过C语言,但我不擅长......当我尝试用C语言实现这个算法时:

ReverseArray(int A[], int i, int j) {
   Input: Array A, nonnegative integer indices i and j
   Output: The reversal of the elements in A starting at index i and ending at j
   if i < j then
      swap A[i] and A[j]
      ReverseArray(A, i+1, j-1)
}

我成功编写了这个代码:

int *reverseArray(int A[], int i, int j) {
   int *R = NULL;
   if(i < j) {
      int temp = A[j];
      A[j] = A[i];
      A[i] = temp;
      R = reverseArray(A, i+1, j-1);
      return R;
   } else {
      return R;
   }
}

但是当我试图在主要部分打印原始和反向数组时:

int main(void) {
   int A[] = {1, 3, 5, 6, 8, 3, 4, 2};

   int *r = reverseArray(A, 0, 7);

   //This prints out the reversed array, when I intended to print the original
   for (size_t i = 0; i < 8; i++) {
      printf("%d ", A[i]);
   }
   printf("\n");

   /* This was intended to print the reversed array but doesn't work
   for (size_t i = 0; i < 8; i++) {
      printf("%d ", r[i]);
   }
   */

   return 0;
}

有人可以解释为什么注释掉的for循环不起作用?为什么第一个for循环打印出反向数组... 有没有其他方法可以在不使用* r的情况下获得reverseArray()的结果? 我尝试使用malloc * r以防万一这是问题,但它仍然没有用。

谢谢。

4 个答案:

答案 0 :(得分:2)

不要回报任何东西。你做了一个返回,所以生成的数组与要反转的数组相同,并且调用者已经知道它。

答案 1 :(得分:2)

你需要在调用reverseArray之前打印A 的内容,而不是之后。原因是你正在反转字节,所以通过调用reverseArray来改变数组A本身。

答案 2 :(得分:1)

  • 尝试使用代码库和问题描述

如果允许在适当的位置重写数组,那么它将起作用

#include<stdio.h>

void reverseArray(int A[], int i, int j) {
   //int *R = NULL;
   if(i < j) {
      int temp = A[j];
      A[j] = A[i];
      A[i] = temp;
      reverseArray(A, i+1, j-1);
   }
}

int main(void) {
   int A[] = {1, 3, 5, 6, 8, 3, 4, 2};

   //This prints out original array
   for (size_t i = 0; i < 8; i++) {
      printf("%d ", A[i]);
   }
   printf("\n");

   reverseArray(A, 0, 7);

   // print the reversed array
   for (size_t i = 0; i < 8; i++) {
      printf("%d ", A[i]);
   }

   return 0;
}
  • 它将输出:
  

1 3 5 6 8 3 4 2
  2 4 3 8 6 5 3 1

答案 3 :(得分:0)

R总是被赋值为NULL,而A不是指针,那么你正在编辑数组的实际数据。

如果要反转并创建新数组,则必须执行以下操作:

int *reverseArray(int array[], int arraySize) {
    int *reversedArray = malloc(sizeof(int) * arraySize);

    for ( int i = 0 ; i < arraySize ; ++i ) {
        reversedArray[i] = array[arraySize - i - 1];
    }
    return reversedArray;
}

您也可以以递归方式执行此操作:

int   *reverseArray(int inputArray[], int arrayLength ) {

    int   *_reverseArray (int inputArray[], int arrayLength, int *outputArray, int actual) {

            if (outputArray == NULL) {
                outputArray = malloc(sizeof(int) * arrayLength);
            }
            if (actual < arrayLength) {
                outputArray[actual] = inputArray[arrayLength - actual - 1];
                return _reverseArray(inputArray, arrayLength, outputArray, ++actual);
            }
            return outputArray;

    }
    return _reverseArray(inputArray, arrayLength, NULL, 0);
}

如果要编辑原始数组:

void    reverseArray(int array[], int arraySize)
{
    for ( int i = 0 ; i < arraySize / 2 ; ++i ) {
        array[i] ^= array[arraySize - i - 1];
        array[arraySize - i - 1] ^= array[i];
        array[i] ^= array[arraySize - i - 1];
  }
}