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

C语言基于二维数组元素值切换索引的递归函数问题排查

问题解答

需求可行性

该需求可以通过递归实现,核心逻辑是沿arr[i][j]指向的行索引跳转遍历,只要补充合法的边界检测、终止条件和访问标记即可完成校验功能。

现有代码问题清单

  • 数组下标越界:C语言数组下标从0开始,你测试的3行3列数组合法行下标范围是0~2,但main函数中循环调用recursive时传入的i范围是1~3,传入i=3时访问arr[3][j]属于越界访问,读取的是内存中无意义的垃圾值,是你看到current_NEq为乱码的核心原因。
  • for循环条件写错:你写的循环是for(int j=0;i<3;j++),循环判断条件误写为i<3而非j<3,会导致j无限递增,持续访问数组边界外的内存,进一步产生垃圾值和非法访问问题。
  • 无递归终止条件与边界检测:递归跳转到arr[i][j]对应的行索引时,既没有判断该值是否在合法的行下标范围内,也没有标记已访问过的行,很容易出现循环递归(例如arr[1][0]=2、arr[2][0]=1就会来回跳转),最终触发栈溢出。
  • 语法不规范:函数声明返回值为int,但整个函数中没有任何return语句,行为属于未定义,部分编译器会直接报错。
  • 校验逻辑缺失:全局变量t没有参与任何业务逻辑判断,现有代码仅做遍历打印,没有实现你描述的排序校验能力。

最小修复示例(仅解决垃圾值问题)

#include <stdio.h>
// 标记已访问的行,避免循环递归
int visited[100] = {0};

void recursive(int i,int n,int m,int arr[n][m])
{
    // 边界检测:行下标非法 或 已经访问过,直接终止
    if(i < 0 || i >= n || visited[i]) return;
    visited[i] = 1;
    // 修正循环条件为j<m
    for(int j=0;j<m;j++)
    {
        if(arr[i][j]!=i)
        {
            printf("i=%d    j=%d  ,    current_NEq=%d  \n",i,j,arr[i][j]);
            // 跳转到对应行递归
            recursive(arr[i][j],n,m,arr);
        }
    }
}
int main()
{
    int x[][3]={{1,3,1},{2,1,2},{3,2,2}};
    // 修正行下标范围为0~2
    for(int i=0;i<3;i++)
    {
        // 重置访问标记
        for(int k=0;k<3;k++) visited[k] = 0;
        recursive(i,3,3,x);
    }

    printf("Hello, World!\n");
    return 0;
}

内容的提问来源于stack exchange,提问作者user786

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:45:04