我在学校学过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以防万一这是问题,但它仍然没有用。
谢谢。
答案 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];
}
}