如何判断两个数组是否互为逆序?现有C语言代码故障求排查
问题:判断两个指定长度数组是否互为逆序
需求:判断两个指定长度的数组是否互为逆序,例如数组A[3] = {1, 2, 3}与数组B[3] = {3, 2, 1}。若互为逆序返回1,否则返回0。
以下是我编写的代码,但无法正常运行:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <assert.h> int* input_array(int); int areReversed(int*, int*, int); int main() { int n = 0; int* A, * B; printf("please enter the size of arrays: \n"); scanf("%d", &n); printf("please enter elements of the first array: \n"); A = input_array(n); printf("please enter elements of the second array: \n"); B = input_array(n); areReversed(A, B, n) ? printf("Arrays are the opposite to one another.\n") : printf("Arrays are not the opposite to one another.\n"); free(A); free(B); } int areReversed(int* A, int* B, int n) { int i = 0, j = n-1; int reverse = 0; if (n > 1) { for (i = 0, j = 0; i < n && j >= 0; i++, j--) { if (A[i] == B[j]) { return areReversed(A + 1, B + 1, n); } if (A[i] != B[j]) return 0; } return 1; } }
代码问题排查
- 循环初始化错误:
j被初始化为0,执行j--后直接变为-1,循环条件j >= 0不满足,循环体完全不会执行。 - 递归逻辑混乱:递归调用
areReversed(A + 1, B + 1, n)时,既没有对应到第二个数组的逆序位置,也没有缩小问题规模(n保持不变),会导致无限递归,最终栈溢出。 - 返回值不完整:当
n <= 1时,函数没有返回语句,属于未定义行为,程序可能返回随机值。 - 逻辑冗余:同时混用循环和递归,逻辑重叠导致判断逻辑失效。
- 函数缺失实现:
input_array只有声明没有定义,编译时会报错。
解决方案
修复后的递归版本
递归核心思路:每次判断数组首元素与另一数组的尾元素是否相等,然后缩小数组范围(首指针后移、问题长度减2),直到长度为0或1时返回1。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <assert.h> int* input_array(int); int areReversed(int*, int*, int); int main() { int n = 0; int* A, * B; printf("请输入数组大小:\n"); scanf("%d", &n); printf("请输入第一个数组的元素:\n"); A = input_array(n); printf("请输入第二个数组的元素:\n"); B = input_array(n); areReversed(A, B, n) ? printf("两个数组互为逆序。\n") : printf("两个数组不互为逆序。\n"); free(A); free(B); } // 补充input_array函数实现 int* input_array(int n) { int* arr = (int*)malloc(n * sizeof(int)); assert(arr != NULL); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } return arr; } int areReversed(int* A, int* B, int n) { // 长度为0或1时,必然满足逆序 if (n <= 1) { return 1; } // 判断首元素与另一数组的尾元素是否相等 if (A[0] != B[n-1]) { return 0; } // 递归判断缩小后的子数组 return areReversed(A + 1, B, n - 2); }
更高效的迭代版本
迭代版本更直观,避免递归栈溢出风险:
// 替换原areReversed函数即可 int areReversed(int* A, int* B, int n) { for (int i = 0; i < n; i++) { // 第i个元素对应第二个数组的第n-1-i个元素 if (A[i] != B[n - 1 - i]) { return 0; } } return 1; }
内容的提问来源于stack exchange,提问作者EraoS
相关产品推荐
相关产品推荐

