递归判断数组是否逆序的C语言函数逻辑问题排查及验证请求
递归函数判断数组逆序的逻辑错误排查及验证
我需要编写一个递归函数,接收数组A和数组B,判断B是否是A的逆序。示例:当A = {1, 4, 6, 7, 5, 3, 2}、B = {2, 3, 5, 7, 6, 4, 1}时返回1,不匹配则返回0。但当前代码无论输入是否正确都返回0,请求排查逻辑错误。我把递归调用参数改成(A + 1, B, n - 1)后测试看似可行,希望得到专业验证。
原始代码如下:
int areReversed(int* A, int* B, int n) { if (n <= 0) return 1; // all elements have been compared and are equal // Compare first element of array A and last element of array B if (A[0] != B[n - 1]) return 0; // elements are not equal // Recursively compare remaining elements of arrays A and B return areReversed(A + 1, B - 1, n - 2); }
原始代码的逻辑错误
- 指针越界问题:递归调用时传入
B - 1,会让B指针直接指向数组起始位置的前一块未知内存区域,后续访问B[n-1]属于非法内存操作,根本无法正确比较元素,最终必然返回0。 - 递归参数n的错误递减:每次递归只完成一对元素的比较(A的首元素和B的尾元素),剩余需要比较的元素数量应该是
n - 1,而不是n - 2。n - 2会导致元素数量过快耗尽,甚至在n为奇数时出现逻辑混乱。
修改后方案的验证
你调整后的(A + 1, B, n - 1)是正确的方向,配合原有的比较逻辑(A[0] != B[n-1])就能实现正确的逆序判断,核心逻辑如下:
- 每一轮比较A的当前首元素与B的当前末尾元素(通过
n-1定位,因为n在递减,相当于每次取剩余未比较部分的最后一个元素)。 - 递归时A指针后移一位(下一轮比较A的下一个元素),B指针保持指向数组起始位置(无需移动,靠n的变化来定位尾元素),剩余待比较元素数减1。
修正后的完整代码
int areReversed(int* A, int* B, int n) { if (n <= 0) return 1; // 所有元素已匹配完成 // 比较A的当前首元素和B的当前末尾元素 if (A[0] != B[n - 1]) return 0; // 元素不匹配,直接返回0 // 递归比较剩余元素:A指针后移,B指针不变,剩余元素数减1 return areReversed(A + 1, B, n - 1); }
逻辑说明
- 终止条件:当
n <= 0时,说明所有元素都已完成匹配,返回1。 - 匹配失败:只要某一对元素不相等,直接返回0,终止递归。
- 递归推进:每次递归只处理一对元素,逐步缩小待比较的范围,直到所有元素验证完成或出现不匹配。
内容的提问来源于stack exchange,提问作者Must
相关产品推荐
相关产品推荐

