无内置函数的递归二维数组遍历及列索引重置问题
解决方案
问题根源
你当前的实现逻辑错误在于:当处理到行首(column=0)时,递归调用上一行仍传入column=0,导致仅处理上一行的第0列而非整行。由于函数签名无总列数参数,无法直接重置列索引到行尾,因此需要调整递归遍历的顺序。
修正后的递归逻辑
换用先递归处理上一行,再遍历当前行的顺序,无需重置列索引:
- 终止条件:当
row < 0时,直接返回结束递归。 - 优先递归处理上一行的全部元素(传入当前行的列尾索引,上一行会自行完成整行遍历)。
- 处理当前位置元素,累加到对应求和变量。
- 若当前列不是行首(
column > 0),递归处理当前行的前一列。
修正代码
int sum(int **array, int row, int column, int &evenSum, int &oddSum) { // 终止条件:所有行处理完毕 if (row < 0) { return 0; } // 先递归处理上一行的全部元素 sum(array, row - 1, column, evenSum, oddSum); // 处理当前元素 if (array[row][column] % 2 == 0) { evenSum += array[row][column]; } else { oddSum += array[row][column]; } // 递归处理当前行的前一列(未到行首时) if (column > 0) { sum(array, row, column - 1, evenSum, oddSum); } return 0; }
调用说明
假设二维数组为m行n列,初始调用需传入最后一行索引(m-1)和最后一列索引(n-1),示例:
int m = 3, n = 4; int** arr = // 初始化二维动态数组 int even = 0, odd = 0; sum(arr, m-1, n-1, even, odd);
更优遍历方式
另一种贴合你最初反向遍历想法的实现:先遍历当前行所有列,再递归处理上一行,无需额外参数:
int sum(int **array, int row, int column, int &evenSum, int &oddSum) { if (row < 0) { return 0; } // 处理当前元素 if (array[row][column] % 2 == 0) { evenSum += array[row][column]; } else { oddSum += array[row][column]; } // 先遍历完当前行所有列 if (column > 0) { sum(array, row, column - 1, evenSum, oddSum); } // 当前行遍历完成后,递归处理上一行 else { sum(array, row - 1, column, evenSum, oddSum); } return 0; }
该方式遍历顺序为:从当前行尾到行首,完成后切换到上一行行尾继续遍历,逻辑更直观。
内容的提问来源于stack exchange,提问作者Hafiz Abdullah
相关产品推荐
相关产品推荐

