0

我在学校学过 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

4 回答 4

2

只是不要返回任何东西。您在适当的位置进行了反转,因此结果数组与要反转的数组相同,并且调用者已经知道它。

于 2015-07-03T12:22:35.967 回答
2

您需要在调用 reverseArray之前打印 A 的内容,而不是之后。原因是您正在反转字节,因此数组 A 本身通过调用 reverseArray 进行了更改。

于 2015-07-03T12:25:00.923 回答
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

于 2015-07-03T12:37:41.080 回答
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];
  }
}
于 2015-07-03T12:10:33.923 回答