考试练习样本与矩阵和递归

时间:2013-01-05 20:39:13

标签: java recursion multidimensional-array matrix

这是过去考试的一个问题(编程基础),我不知道如何解决(经过两个多小时的尝试):

编写方法void fillingSumOfNeighbours(int[][]m),假设m是最后一列和最后一行已填充的矩阵(非零),请使用总和m[i][j]=m[i][j+1]+m[i+1][j]+m[i+1][j+1]填充其余值。这个方法必须是递归的!

到目前为止,我可以用正确的方式填充矩阵,但是如果不使用字段计数器就不能使递归有限(对我来说似乎不正确,因为使用字段计数器来阻止递归需要定义类)。有没有办法定义直接递归方法应该只在该方法中运行的次数?

基本上应该这样做:

_ _ 1
_ _ 1
1 1 1 

_ _ 1
_ 3 1
1 1 1

_ 5 1
_ 3 1
1 1 1

_ 5 1
5 3 1 
1 1 1

13 5 1
5  3 1
1  1 1

3 个答案:

答案 0 :(得分:2)

通过查看您的示例和问题陈述,很明显,您需要运行3次递归: -

  • 一个向上垂直向上移动
  • 一个向左水平移动
  • 一个用于斜对角线。

因此,要管理该移动,您还必须将索引传递给您的方法。我希望你能修改这个方法。

所以,基本上你的递归调用将是这样的: -

fill(arr, row - 1, col);
fill(arr, row, col - 1);
fill(arr, row - 1, col - 1);

假设fill是您的方法,需要3个参数: -

  • int[][] arr
  • int row
  • int col

现在,您可以看到的第一个调用是减小行值,从而向上移动索引。第二个电话是向左走。最后一次调用将需要涵盖top-left最多索引。

在你的方法中,你只需要编写逻辑来填充你传递的当前索引,使用你的公式。是的,不要忘记基本条件,即,当任一索引小于0时,则立即返回。

所以,这就是你的方法的样子: -

public static void fill(int[][] arr, int row, int col) {
    arr[row][col] = arr[row][col + 1] + arr[row + 1][col] + arr[row + 1][col + 1];
    if (row <= 0 || col <= 0) {
        return;
    }
    fill(arr, row - 1, col);
    fill(arr, row, col - 1);
    fill(arr, row - 1, col - 1);
}

初始调用如下: -

fill(arr, row - 2, col - 2);

row是最大行大小,col是最大大小。

答案 1 :(得分:1)

preencheComSomaVizinhos (int[][]m){
    get(m,0,0)
}
get(int[][]m, int i, int j){
    if(!(i == m.length-1 || j==m.length-1)){
        m[i][j] = get(m, i, j+1) + get(m,i+1,j)+get(m,i+1,j+1);

    }
    return m[i][j]; 
}

答案 2 :(得分:0)

我写它来递归行和列号,当你在最后一行时用一个基本案例。如果数组是方形的,你只需要一个递归参数(我假设是这种情况)。

通过递归的一部分,你有这样的情况:

0 0 0 0 0 *
0 x + + + *  <- currently working on row k
0 - & & & *
0 - & & & *
0 - & & & *
* * * * * *

{J}已在您开始之前填充*。然后使用参数k+1调用递归函数,该函数填充标记为&的所有单元格。然后,您必须手动填写标有+ s的行,标有- s的列,以及标记为x的角上的单个单元格。然后将控制权传递给调用您的函数,该函数将填充标记为0的其余单元格。

我还没有写一年的Java,原谅我粗鄙的语法!

void fillNeighbours(int[][] m) {

  int size = m.length;

  run(m, size, 0);  

}

void run(int[][] m, size, row) {

  if (row < size) {

    // fill the rest of the rows and cols
    run(m, size, row+1)

    // fill the column and row for this iteration
    for (int i = 1; size-i > row; i++) {
      m[row][size-i] = m[row+1][size-i] + m[row][size-i+1];
      m[size-i][row] = m[size-i+1][row] + m[size-i][row+1];
    }

    // fill the corner cell
    m[row][row] = m[row+1][row] + m[row][row+1];

  } else {
    // Base case, do nothing
  } 

}