递归实现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)); }
修复要点说明
- 优先边界校验:每次递归先判断
i和j是否超出数组行/列范围,超出则直接返回false终止递归。 - 完善遍历逻辑:先遍历当前行的所有列,当前行无目标值时,递归进入下一行的第一列继续搜索,覆盖整个3x3数组。
- 移除无用参数:删掉无实际作用的
found参数,简化函数结构。 - 修正位置计数:切换行时,位置计数补上当前行剩余未遍历的列数,保证
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
相关产品推荐
相关产品推荐

