首页 > 解决方案 > 如何在下一次递归调用中从二维数组中的下一列\行开始?(C)

问题描述

我正在尝试实现与此类似的目标:

    int change(int coins[],int n,int sum)
{

    if (n==0)return 0;
    if (coins[0]==sum)return 1;
    if (coins[0]>sum)return 0;
    int options = change(coins+1,n-1,sum);//adding next value
    int self_options = change(coins,n,sum-coins[0]);//adding the first value
    return self_options+options;

}

我指的是这一行:

int options = change(coins+1,n-1,sum);

这使得递归的下一次迭代从数组的下一个元素开始。

我正在尝试使用 2d 数组实现类似的功能,但不知道如何操作。

可以说我有一个[N] [N]。如何在下一次递归迭代中从下一行或下一列开始?

谢谢!

标签: carraysrecursionmultidimensional-array

解决方案


方法与一维数组类似,例如:

#include <stdio.h>

#define ROWS 3
#define COLUMNS 4

/* compute the sum of arr[row][0] .. arr[row][COLUMNS - 1] */
int sumRow(int (*arr)[COLUMNS], int row, int col)
{
  return (col == COLUMNS)
    ? 0
    : sumRow(arr, row, col + 1) + arr[row][col];
}

/* compute the sum of arr[0][col] .. arr[nRow][col] */
int sumCol(int (*arr)[COLUMNS], int row, int nRow, int col)
{
  return (row == nRow)
    ? 0
    : sumCol(arr, row + 1, nRow, col) + arr[row][col];
}

int main()
{
  int arr[ROWS][COLUMNS];

  for (int r = 0; r != ROWS; ++r) {
    for (int c = 0; c != COLUMNS; ++c) {
      arr[r][c] = 10*r + c;
      printf("%3d", arr[r][c]);
    }
  }

  printf("sum[2][*] = %d\n", sumRow(arr, 2, 0));
  printf("sum[*][1] = %d\n", sumCol(arr, 0, ROWS, 1));
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra rc.c
pi@raspberrypi:/tmp $ ./a.out
  0  1  2  3
 10 11 12 13
 20 21 22 23
sum[2][*] = 86
sum[*][1] = 33

20+21+22+23 = 86

1+11+21 = 33

当然,这里的递归可以很容易地删除,但这不是主题,并且请求了递归


推荐阅读