以递归方式查找路径,溢出?

时间:2013-09-22 00:18:32

标签: java recursion path

我一直在为我的CS课程做实验室作业, 我必须填写教练提供给我的方法, 我已经到了可以导航到数组中的一个点的点 标记要移入的方向,但它仅适用于某些位置 虽然我可以看到一条清晰的道路。

例如,如果我输入8,2它找到路径就好了

这是一张照片:

enter image description here

但如果我进入明确可以接受的8,3点,我会得到 溢出和我的程序只是在第24行和第35行之间来回跳转

如果有人对我出错的地方有任何想法,我会很感激一些提示! 谢谢大家

public char[][] findPath(int startRow, int startCol, int destRow, int destCol,  int threshold){

    if((startRow==destRow)&&(startCol==destCol)){
        JOptionPane.showMessageDialog(null, "A path has been found!");
        map[destRow][destCol] = '^';

        return map;

        }

    else if(startRow < 9 && checkIfPassable(startRow + 1, startCol, threshold)){
        map[startRow][startCol]= 'S';
        startRow++;
        return findPath( startRow,  startCol, destRow, destCol, threshold);

        }
    else if(startCol < 9 && checkIfPassable(startRow , startCol + 1, threshold)){
        map[startRow][startCol]= 'E';
        startCol++;
        return findPath( startRow,  startCol, destRow, destCol, threshold);
     }
    else if(startRow > 1 && checkIfPassable(startRow -1, startCol, threshold)){
        map[startRow][startCol]= 'S';
        startRow--;
        return findPath( startRow,  startCol, destRow, destCol, threshold);

        }
    else if(startCol > 1 && checkIfPassable(startRow , startCol -1, threshold)){
        map[startRow][startCol]= 'E';
        startCol--;
        return findPath( startRow,  startCol, destRow, destCol, threshold);
     }



    System.exit(1);
    return map;

}

2 个答案:

答案 0 :(得分:0)

提示:您应该尝试自己调试:

  • 使用附加的调试器运行程序。 (由于您使用的是Eclipse,因此非常容易。同样适用于其他IDE。否则,请查看jdb上的Oracle文档 - http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/jdb.html

  • 设置断点以使程序停在适当的位置。

  • 程序在递归时单步执行,检查局部变量的状态和相关的map单元格。

  • 确定其表现与预期的不同。

  • 修改算法。


现在我们可以尝试找出你的错误,但是你没有向我们展示足够的代码。更重要的是,你需要自己学会这样做!

答案 1 :(得分:0)

您的搜索算法需要更系统化。在写完这篇文章的时候,你会绕圈子走,直到你溢出堆栈。您需要确保不要回溯已经访问过的空间。

在风格上,如果您要使用递归实现,则应该创建所有方法参数final,并使用+1-1进行递归调用,而不是在递归调用之前使用++--,因此只需通过递归调用喜欢递归的方式就可以了。此外,打开对话框或在计算中杀死应用程序通常是不好的形式。如果您需要有关代码正在执行的操作的反馈,请使用System.out.println或日志库。