我正在尝试解决以下问题:
给定数字n,生成大小为2 ^ n * 2 ^ n的矩阵,使其符合以下规则:
n = 1
[ 1 2 ]
[ 3 4 ]
n = 2
[ 1 2 5 6 ]
[ 3 4 7 8 ]
[ 9 10 13 14 ]
[ 11 12 15 16 ]
这是我的算法:
static void generare(int i , int j , int x , int y){
if(x - i == 1 && y - j == 1)
{
mat[i][j] = counter++;
mat[i][j+1] = counter++;
mat[i+1][j] = counter++;
mat[i+1][j+1] = counter++;
}
else{
generare(i,j,x/2,y/2);
generare(i,y/2+1,x/2,y);
generare(x/2+1,j,x,y/2);
generare(x/2+1,y/2+1,x,y);
}
}
适用于n = 1,2但是当我尝试任何数字时> 2,它崩溃了。我该如何修复递归函数?
答案 0 :(得分:3)
首先,我认为你调用函数的方式是不正确的。对我来说,你发布的代码甚至不适用于4X4阵列。我认为应该使用(0, 0, 2^n, 2^n)
调用递归函数
无论如何,解决方案如下(我将解释):
private static int[][] mat;
private static int counter = 1;
public static void generare(int i, int j, int x, int y) {
if (x - i <= 2 && y - j <= 2) {
mat[i][j] = counter++;
mat[i][j+1] = counter++;
mat[i+1][j] = counter++;
mat[i+1][j+1] = counter++;
} else {
generare(i, j, x/2+i/2, y/2+j/2);
generare(i, j+(y-j)/2, x/2 +i/2, y);
generare(i+(x-i)/2, j, x, y/2+j/2);
generare(i+(x-i)/2, j+(y-j)/2, x, y);
}
}
public static void main(String[] args) {
int power=3;
int n =(int) Math.pow(2, power);
mat = new int[n][n];
generare(0, 0, n, n);
for(int i=0;i<n;i++) {
for(int j=0; j<n; j++){
System.out.print(mat[i][j] +" ");
}
System.out.println();
}
}
我解决它的方式是:
对于n = 1,2,它适用于你,因为递归调用只发生过一次。一旦您的代码多次运行,计算就不正确了。我所做的是绘制了一个8乘8的数组,并尝试仅使用i,j,x和y来表示调用。 希望这会有所帮助:)