2012-08-25 83 views
0

我正在创建一个小游戏,您需要在地图上移动部队。要检测是否可以完成移动,我必须验证是否有2个方块之间的方法。 因此,递归地从一个方块开始,取四个方块(上面,下面,左边和右边)以及以下条件递归地重复测试,因为我只得到死角或目标方块。所有广场必须在玩家的控制之下。Android:堆栈溢出错误 - 递归太深

有一个在我的课堂案例我的递归代码实现:

public boolean isContiguJoueur(Case case_origine, Case case_destination, Case[] cases) { 
boolean haut_true=false, droite_true=false, bas_true=false, gauche_true=false; 
// Above 
if(this.haut!=null) { 
    if(haut.joueur==this.joueur && this.haut!=case_origine) { 
    if(this.haut==case_destination) { 
    return true; 
    } 
    haut_true=haut.isContiguJoueur(this,case_destination, cases); 
    } 
} 
// ... 
// Same code than Above, only variables names change 
// ... 
return haut_true||droite_true||bas_true||gauche_true; 
} 
  • 的类名方:案例
  • 地图数据:案例[]的情况下
  • 玩家ID: joueur
  • 上面的情况下:HAUT

即共在小地图上工作得很好(〜50到100格)。但我得到这个更大的:

08-25 11:26:31.912: E/AndroidRuntime(5497): FATAL EXCEPTION: main 
08-25 11:26:31.912: E/AndroidRuntime(5497): java.lang.StackOverflowError 
08-25 11:26:31.912: E/AndroidRuntime(5497):  at mypackage.isContiguJoueur(Case.java:xxx) 
... x 100 

对不起,我英语不好,谢谢你的帮助! :-)

编辑:我忘了。为了避免大规模无用的递归测试,我已经这样做:

if(this.droite!=null && !haut_true) { 
// ... 
if(this.bas!=null && !haut_true && !droite_true) { 
// ... 
if(this.gauche!=null && !haut_true && !droite_true && !bas_true) { 
// ... 
+0

@Jonathan其实,我认为[stack-overflow]在这里是正确的标签。 –

+0

@AndrewBarber,谢谢,都加了。我正在编辑一个错误标记为[tag:overflow]的帖子的整个负载,并认为这是java特定的,我会使用java异常类型,但是在反思中我同意更通用的标记至少与此相关。 –

回答

0

你的问题是,你的路径是指数与上板方格数目。堆栈溢出错误意味着你递归的次数太多:每次递归占用堆栈空间,并且你用尽了它(Chaque递归利用了空间堆积,等等,加上d 'espace - et c'est unedépassementde pile)。

你可以迭代地做(无递归)而不会遇到这个问题。但请记住,可能路径的数量仍然是非常大大,这可能是CPU消耗。

希望这有助于

TG

+0

编辑:至于你添加的无用递归测试 - 仍然不够。这些测试可以在路径的末尾,到那时堆栈已经“爆炸”了。同样,迭代,而不是递归,可以工作。 – Technologeeks

+0

那么除了迭代以外没有别的办法吗? –

+0

总是有尝试使用不同递归算法的选项,和/或进一步限制递归。但是如果我没有更多的细节,我不能推荐一种算法。增加堆栈深度将是一个临时解决方案,但仍然会很快爆炸。 – Technologeeks

1

我只是在我的课案例添加一个布尔值,如果我测试这个案例我设置布尔为true我不晚进来了。改进非常重要! 之前它是关于n^4(n是玩家拥有的情况下的数量)测试。现在是关于n。用我最大的地图和玩家拥有整个地图我没有错误。