You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归判断数组是否逆序的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);
}

原始代码的逻辑错误

  1. 指针越界问题:递归调用时传入B - 1,会让B指针直接指向数组起始位置的前一块未知内存区域,后续访问B[n-1]属于非法内存操作,根本无法正确比较元素,最终必然返回0。
  2. 递归参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:55:18