2016-11-27 108 views
1

我试图解决以下问题:生成的特殊矩阵“

给定一个数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

1.什么是“垫子”? 2.它与什么错误/异常崩溃? – UnholySheep

+0

mat是我矩阵的名字。我得到的错误是“java.lang.StackOverflowError”。我的递归函数在一个无限循环中结束,但我不知道应该添加什么条件,所以我的函数仍然会按照我希望的方式执行。 – ivanciprian

+0

“mat”是如何定义的?同样在这些计算中检查相等性通常是一个坏主意,相反,您应该(可能)使用'<='。你的代码也不包含一个'n'变量,那么你怎么调用它呢? (我假设你为每个参数传递相同的数字?) – UnholySheep

回答

3

首先,我认为你称为函数的方式不正确。对于我来说,你发布的代码甚至没有工作了4X4 array.I认为递归函数应该(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(); 
    } 
} 

我解决它的方法是:当我们通过2阵列达到2

  1. 递归函数应该停止。
  2. 如果数组大于2乘2阵列。我们应该打4个电话(像你一样),但有4个子阵列。这是你错误的地方,只是计算本身。

它为你工作n = 1,2因为递归调用只发生一次。一旦你的代码运行不止一次,计算不正确。我所做的是绘制了一个8乘8的数组,并试图仅使用i,j,x和y来表示调用。 希望这有助于:)

+0

谢谢你的exlanation,现在我明白了:) – ivanciprian

+0

如果你愿意,我将不胜感激可以接受答案并进行投票。谢谢 – guymaor86