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

无内置函数的递归二维数组遍历及列索引重置问题

解决方案

问题根源

你当前的实现逻辑错误在于:当处理到行首(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:42:12