这是过去考试的一个问题(编程基础),我不知道如何解决(经过两个多小时的尝试):
编写方法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
答案 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
}
}