首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归算法的StackOverflowError

递归算法的StackOverflowError
EN

Stack Overflow用户
提问于 2020-12-10 22:51:24
回答 1查看 69关注 0票数 1

我试图编写一个递归算法,以便为一个名为kakuro的游戏生成一个有效的板(唯一的解决方案)。在执行程序时,我一直得到一个StackOverflowError。我试着调试我的代码,它按照预期工作,但是它突然在一个非递归方法中崩溃。我一直在互联网上读到这个问题,我已经检查过了,我没有用相同的参数进行两次递归调用。该算法对某些方格尝试不同的值,并且(当每个正方形都有它自己的值时,它应该尝试这些方格的每一个可能的值组合)来解决它,以确定它是否有一个唯一的解。

代码语言:javascript
复制
 private boolean generarKakuroRecursivo(ArrayList<Negra> noColocados, Casella[][] tablero){
        if (noColocados.size() == 0 ){
            System.out.println(getStringTablero());
            if (kakuroUnico(tablero)){
                this.tauler = tablero;
                return true;
            }
            else return false; 
        }
        
        Negra casillaNegra = noColocados.get(0);

        boolean fila = casillaNegra.getFila() == 0 && casillaNegra.getCoords().getElement1()+1 < dimensio && this.tauler[casillaNegra.getCoords().getElement0()][casillaNegra.getCoords().getElement1()+1].getTipus() == 'B';
        boolean columna = casillaNegra.getColumna() == 0 && casillaNegra.getCoords().getElement0()+1 < dimensio && this.tauler[casillaNegra.getCoords().getElement0()+1][casillaNegra.getCoords().getElement1()].getTipus() == 'B';
        ArrayList <Pair<Integer, ArrayList<ArrayList<Integer>> >> posibilidadesNegra = calcularPosibilidades(casillaNegra);

        //CALCULAMOS LOS POSIBLES NUMEROS PARA LA CASILLA NEGRA QUE HEMOS COGIDO

        int index1 = casillaNegra.getCoords().getElement0(), index2 = casillaNegra.getCoords().getElement1();
        for (Pair<Integer, ArrayList<ArrayList<Integer>> > posibilidad : posibilidadesNegra){
            int valor = posibilidad.getElement0();
            if (fila && columna){
                colocarNegra(((Negra)tablero[index1][index2]), valor, true);
                noColocados.get(0).setNumFil(valor); //poner fila =false
            } //actualizar restricciones
            else if(fila){
                colocarNegra(((Negra)tablero[index1][index2]), valor, true);
                noColocados.remove(0);
            }
            else if (columna){
                colocarNegra(((Negra)tablero[index1][index2]), valor, false);
                noColocados.remove(0);
            }
            if (generarKakuroRecursivo(noColocados, tablero)) return true;
            else{
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     if (!noColocados.contains(casillaNegra)) noColocados.add(casillaNegra);
                if (fila){
                    retirarNegra((Negra)tablero[index1][index2],true);
                    if (!noColocados.contains(casillaNegra)) noColocados.add(casillaNegra);
                }

                else if (columna) {
                    retirarNegra((Negra)tablero[index1][index2], false);
                    if (!noColocados.contains(casillaNegra)) noColocados.add(casillaNegra);
                }

            }
        } //Caso recursivo

        //PROBAMOS RECURSIVAMENTE TODAS LAS OPCIONES

        return false;
}

这是讨论中的递归函数,noColocados是一个ArrayList,它包含方块(属于tablero),在这里我们要尝试所有可能的组合(如果其中一个组合生成唯一的解决方案(应该会发生),则算法停止)。

该算法在崩溃前生成的板

正如您在上面的图片中所看到的,该算法在崩溃之前运行良好。

崩溃的调试信息

在这幅图中,您可以看到触发StackOverflowError的位置,因为您可以看到calculaNumCells是一个非递归方法。

编辑:我还尝试不解析参数tablero,因为它是不必要的(它与类的隐式参数相同),不需要递归算法或其他方法,比如CalculaNumCells。不管怎么说,执行程序一直在崩溃,就像之前的崩溃一样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-10 23:07:14

StackOverflowError只是表示堆栈中没有新帧可用的空间。在您的示例中,递归调用仍然填充了大部分堆栈,但是,由于该方法调用了除自身之外的其他方法,这些方法也会耗尽堆栈。

例如,如果递归方法只调用自身,则调用该方法时堆栈总是会耗尽。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65243424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档