C#中的递归求和矩阵子

时间:2018-10-12 16:17:13

标签: c# algorithm recursion func

我正在尝试不使用循环来解决问题,但是我找不到办法...

让我们以这个数组为例:(假设存在随机值)

1, 2, 3, 4, 5
2, 3, 4, 5, 6
3, 4, 5, 6, 7
4, 5, 6, 7, 8
5, 6, 7, 8, 9

通过发送(第2行,第1列),我想获得以下金额的总和:

1, 2
2, 3
3, 4

我编写此递归函数来解决此问题:

static int Func(int[,] matrix, int row, int column)
{
    if (row == -1 || column == -1)
        return 0;

    int result = 0;

    for (int i = 0; i <= column; i++)
    {
        result += matrix[row, i];
    }

    return result + Func(matrix, row - 1, column);
}

那行得通,但我想用额外的函数调用来代替循环...

1 个答案:

答案 0 :(得分:0)

您总是可以通过考虑处理单个条目的函数来尝试简化递归,然后让其余条目由下一个递归调用处理

可以解决您问题的基本思路:尝试对矩阵右下角到左上角的数字求和(这样,您就可以对行/列使用负索引来验证何时到达矩阵的边界矩阵)。

因此,在您的特定情况下,有三个要点:

  • (A)函数应返回位于矩阵给定的(row,col)位置的数字,以及从下一个数字按求和顺序: sum(row,col)= mat [row,col] + sum(row,col-1)
  • (B)通过重复执行(A)递归调用,在某些时候将为负...发生这种情况时,我们应转到上方行我们正在处理的当前行,并对该行上的所有列求和。
  • (C)在某些时候,所有矩阵都将相加,并且数字将为负。那是当算法需要结束递归时,因为程序已经计算出需要计算的整个输入。

所以您可以这样写:

static int Func(int[,] matrix, int row, int column, int maxColumn)
{
    // (C) All rows have been processed successfully: stop the recursion.
    if (row < 0)
        return 0;

    // (B) All columns in the current line have been processed: go to the next row
    // which you need to sum
    if (column < 0)
        return Func(matrix, row - 1, maxColumn, maxColumn);

    // (A) The basic definition of your recursion
    return matrix[row, column] + Func(matrix, row, column - 1, maxColumn);
}

在您的输入示例中,您可以简单地将其称为:

Func(yourMatrix, 2, 1, 1);

请注意,要使该算法起作用,您需要传递一个额外的变量maxColumn,以使函数知道在移至需要处理的下一行时应使用的列号。显然,maxColumncolumn参数在您第一次调用Func()函数时必须始终相等。