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() の結果を取得する他の方法はありますか? それが問題だった場合に備えて、* r を malloc しようとしましたが、それでも機能しませんでした。

ありがとうございました。

4

4 に答える 4

2

何も返さないでください。その場で反転を行うため、結果の配列は反転される配列と同じであり、呼び出し元はそれを既に認識しています。

于 2015-07-03T12:22:35.967 に答える
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 に答える