c - 在不多次添加角的情况下对矩阵的周长求和

标签 c

我正在尝试使用递归对大小为 n 的矩阵的周长求和。 (没有多次添加角)

我写的是无限循环,不排除角点。如何停止无限循环并排除角落?

int
sumPerimeter(int** matrix, int i, int j, int height, int width)
{
    if (i == 0 && j == 0)
      return matrix[i][j] + sumPerimeter(matrix, i + 1, j, height, width);

   if (i == height && j == 0)
      return matrix[i][j] + sumPerimeter(matrix, i, j + 1, height, width);

   if (i==height&& j == width)
      return matrix[i][j] + sumPerimeter(matrix, i - 1, j, height, width);

   if (i == 0 && j == width)
      return matrix[i][j] + sumPerimeter(matrix, i, j - 1, height, width);
}

我决定将其分成几个阶段以使其更容易,下面的代码是我目前的尝试。当我使用 visual studio 单步执行它时,它起作用了,但它总是返回矩阵中的第一个数字。

   int
   sumRight(int** matrix, int i, int j, int height, int width,int count)
   {


   if (0 > width)
      return 0;

   if (j > width - 1)
      return count;

      int sum = matrix[i][j];
       count = sum + count;

   sumRight(matrix, i, j + 1, height, width,count);



   return count;

}

我弄清楚了为什么它没有返回正确的值。但我不知道如何让它不多次计算角点。对此有任何建议,我们将不胜感激。

最佳答案

如果您必须为此使用递归(这可能是个坏主意,因为您得到的很少,但出于教育目的可能没问题1),您可以选择一个简单的方法。

假设基本情况是高度为零的矩阵,重复情况是将第一行的总和与矩阵其余部分的总和相加。换句话说,类似于以下伪代码:

def sumOfMatrix (matrix m, int row, int height, int width):
    # No rows left, return zero.

    if row == height:
        return 0

    # Get sum of first row.

    sum = 0
    for col in 0..width-1 inclusive:
        sum = sum + m[row][col]

    # Return that plus sum of rest of matrix.

    return sum + sumOfMatrix (m, row+1, height, width)

如果你真的想变得聪明,对于“聪明”这个词的一些奇怪的定义:-),你可以做两种完全不同类型的递归,一种用于一行,另一种用于矩阵:

def sumOfRow (matrix m, int row, int col, int width):
    # No columns left, return zero.

    if col == width:
        return 0

    # Get value plus sum of rest of row.

    return m[row][col] + sumOfRow (m, row, col+1, width)

def sumOfMatrix (matrix m, int row, int height, int width):
    # No rows left, return zero.

    if row == height:
        return 0

    # Get sum of this row plus sum of all other rows.

    return sumOfRow (m, row, 0, width) + sumOf (m, row+1, height, width)

1 如前所述,这可能是递归的错误用例,因为您可以简单地执行紧凑的迭代解决方案:

def sumOfMatrix (matrix m, int height, int width):
    sum = 0
    for row = 0..height-1 inclusive:
        for col = 0..width-1 inclusive:
            sum = sum + m[row][col]
    return sum

但是,如果您需要一个递归解决方案(因为您是自学递归,或者您的教育者没有能力思考更好的现实世界问题),上面的递归代码应该足够了来帮助你。

关于c - 在不多次添加角的情况下对矩阵的周长求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27306143/

相关文章:

c - 为什么在 pthread_join 中 retval 是一个 void**?

c - 为什么我不能在内联汇编中使用两个以上的寄存器?

c - 构建失败 - 嵌入式 C STM32F10X

在 C 中创建位图 - 如何将/r/n 写为 1 个字节?

c - 从与预期最终位置不同的位置链接共享库

c - C 结构中的箭头与点?

c - OpenSSL 函数 EVP_PKEY_keygen 中的内存泄漏

c - 在 C 中一次在 char 数组中设置多个值(重新实现 strcpy)

c - C什么时候释放struct的内存

对创建二进制 sysfs 条目感到困惑