Java 7递归函数生成多维数组所有索引的问题求助
解决多维数组索引递归遍历的数组越界问题
我来帮你排查下代码里的问题,然后给出能正确生成所有索引组合的递归实现~
原代码的核心问题
你的代码出现数组越界,主要是这几个逻辑漏洞导致的:
- 条件判断顺序错误:你先判断
index[dimensionIndex] < dimensionSizes[dimensionIndex],但没有先检查dimensionIndex是否已经超出维度数组的长度。当dimensionIndex等于dimensionSizes.length时,访问index[dimensionIndex]就会触发数组越界(因为index的长度和维度数一致,最大索引是length-1)。 - 缺少正确的终止逻辑:你没有明确处理“所有维度都遍历完成”的情况,反而在循环中途输出索引,导致很多组合被遗漏,同时递归的走向也混乱。
- 索引重置逻辑缺失:当某一维遍历到最大值后,你没有把该维的索引重置为0,后续递归时无法正确生成下一组跨维度的组合。
正确的递归实现方案
下面是修正后的代码,逻辑更清晰,能正确生成所有维度的索引组合:
import java.util.Arrays; public class MultiDimIndexGenerator { public static void main(String[] args) { // 测试二维6×6数组 generateAllIndexes(new int[]{6, 6}); // 测试三维2×2×2数组 // generateAllIndexes(new int[]{2, 2, 2}); } private static void generateAllIndexes(int[] dimensionSizes) { // 初始化索引数组,长度与维度数一致,初始值默认都是0 int[] currentIndex = new int[dimensionSizes.length]; recursiveGenerate(currentIndex, dimensionSizes, 0); } private static void recursiveGenerate(int[] currentIndex, int[] dimensionSizes, int currentDim) { // 终止条件:所有维度都已设置完成,输出当前索引组合 if (currentDim == dimensionSizes.length) { System.out.println(Arrays.toString(currentIndex)); return; } // 遍历当前维度的所有可能取值 for (int i = 0; i < dimensionSizes[currentDim]; i++) { currentIndex[currentDim] = i; // 递归处理下一个维度 recursiveGenerate(currentIndex, dimensionSizes, currentDim + 1); } } }
代码逻辑说明
- 终止条件明确:当
currentDim等于维度数组的长度时,说明我们已经为每个维度都设置了索引值,此时直接输出当前的索引组合即可。 - 维度遍历逻辑清晰:对于每个维度,我们从0遍历到该维度的最大值(
dimensionSizes[currentDim]-1),设置好当前维度的索引值后,递归进入下一个维度的处理。 - 自动覆盖索引值:因为递归返回后,循环会继续给当前维度赋值下一个数值,所以不需要手动重置索引——下一次循环会自动覆盖之前的值,保证每一组组合都是正确的。
这样运行代码后,就能得到你需要的所有索引组合:比如int[]{6,6}会输出36组二维索引,int[]{2,2,2}会输出8组三维索引,而且不会出现数组越界的问题。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

