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

递归实现3x3数组线性搜索:函数无法返回true的修复方案

问题分析与修复方案

你的递归函数存在几个关键问题:

  • 仅遍历单行,未覆盖全部数组:当前代码只在固定的i行内递归遍历列,没有切换到下一行继续搜索,完全没处理3x3数组的另外两行。
  • 数组越界风险:原代码先判断a[i][j]==search再检查j<3,当j=3时会直接访问超出数组范围的索引(3x3数组列索引仅为0-2),触发数组越界错误。
  • 无用参数冗余:found参数在函数内从未被修改,最终返回它完全没有意义。

修复后的代码

public static boolean inner(int a[][], int i, int j, int search, int c) {
    // 先做边界检查,避免数组越界
    if (i >= 3 || j >= 3) {
        return false;
    }
    // 找到目标值,直接返回true
    if (a[i][j] == search) {
        System.out.println("found at " + c);
        return true;
    }
    // 先递归遍历当前行的下一列
    boolean foundInCurrentRow = inner(a, i, j + 1, search, c + 1);
    if (foundInCurrentRow) {
        return true;
    }
    // 当前行遍历完没找到,切换到下一行的第一列继续搜索
    return inner(a, i + 1, 0, search, c + (3 - j));
}

修复要点说明

  1. 优先边界校验:每次递归先判断i和j是否超出数组行/列范围,超出则直接返回false终止递归。
  2. 完善遍历逻辑:先遍历当前行的所有列,当前行无目标值时,递归进入下一行的第一列继续搜索,覆盖整个3x3数组。
  3. 移除无用参数:删掉无实际作用的found参数,简化函数结构。
  4. 修正位置计数:切换行时,位置计数补上当前行剩余未遍历的列数,保证c的计数准确对应数组的线性位置。

调用示例

搜索3x3数组的初始调用示例:

int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
// 从数组第1个位置(线性计数)开始搜索目标值5
boolean result = inner(arr, 0, 0, 5, 1);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:07:46