【发布时间】:2010-11-14 03:49:11
【问题描述】:
我一直在尝试编写一个 java 类来使用某种堆叠和递归来解决 n 个皇后问题,答案存储在网格(二维数组)中,但我遇到了堆栈的死墙在 n=8 处递归溢出(最大递归深度达到 2298) 所以我一直想知道是否有某种方法可以通过做一些复杂的事情来绕过这个死,比如在java中分配更多的堆空间(如果可能的话?)或使用多线程(指出我的教程/示例)......或者请就如何优化代码提供建议... 提前致谢
public void resoudre(){
this.gridPile.push(copyGrid(grid));
try{
int row = gridPile.size()-1;
if(gridPile.size()==0)row = 0;
chooseGridSpace(this.grid, locateFirstAvailable(grid, row));
if(gridPile.size() == this.taille){
gridSolutions.push(copyGrid(grid));
grid = gridPile.pop();
boolean erronous = true;
while(erronous){
try{
MakeNextUnavailable(grid, gridPile.size());
erronous = false;
}
catch(UnavailabilityException r1){
try{
grid = gridPile.pop();
}
catch(java.util.EmptyStackException r2){
return;
}
}
}
}
}
catch(InvalidPositionException e1){
this.grid = gridPile.pop();
boolean error = true;
while(error){
try{
MakeNextUnavailable(grid, gridPile.size());
error = false;
}
catch(UnavailabilityException er){
try{
this.grid = gridPile.pop();
}
catch(java.util.EmptyStackException err){
return;
}
}
}
}
catch(java.lang.ArrayIndexOutOfBoundsException e2){
return;
}
this.resoudre();
}
private static void chooseGridSpace(int[][] grid, Position a){
grid[a.getLigne()][a.getColonne()] = 1;
fillNotAvailable(grid, a);
}
【问题讨论】:
-
我做了一些简单的优化,一个是为了避免递归结构所以代替
public void resoudre(){ /** * 代码行数 <i>/ resourdre(); } </i>我做了public void resoudre(){ do{ /* * 代码行 */ } while(true); }无论如何,我同意下面的一些意见,即程序结构更简单,但我选择了这种方式来简化 gui 操作......
标签: java recursion stack-overflow