如何在没有基本情况的情况下突破递归

时间:2014-02-12 00:46:56

标签: java recursion break maze

所以我正在研究这个程序,它将递归地解决我从txt文件中获得的迷宫。我将迷宫放入2d阵列。这是最简单迷宫的一个例子。

+-+-+-+
|S|   |
+ + + +
|   |E|
+-+-+-+

我知道我可能不会以最好的方式解决迷宫,但我认为我的方式有效,我只需要知道如何打破我的递归循环。我正在做的是检查下一个地方是否有一个寄宿生,如果有两个地方,如果没有'*'那么我移动那里并放下一个标记。这让我走到了迷宫的尽头,但之后就破了。我需要一种摆脱循环的方法。我刚刚开始学习递归,所以我认为这是问题,但我不确定。

错误的选择方法会让我回到最后一个地方,那里有一个有开放边界的单元格,而且在两个地方没有'*'。

public static void solveMaze(int COL, int ROW){
   //find first open cell and choose it

         if(drawArray[COL][ROW+1] == ' ' && drawArray[COL][ROW+2] != '*'){
            //if(drawArray[COL][ROW+2] == 'E')

            drawArray[COL][ROW+2] = '*';
            ROW+= 2;
            solveMaze(COL,ROW);
         }  
         else if(drawArray[COL+1][ROW] == ' ' && drawArray[COL+2][ROW] != '*'){
            drawArray[COL+2][ROW] = '*';
            COL+= 2;
            solveMaze(COL,ROW);
         }
         else if(drawArray[COL][ROW-1] == ' ' && drawArray[COL][ROW-2] != '*'){
            drawArray[COL][ROW-2] = '*';
            ROW-= 2;
            solveMaze(COL,ROW);        
         }
         else if(drawArray[COL-1][ROW] == ' ' && drawArray[COL-2][ROW] != '*'){
            drawArray[COL-2][ROW] = '*';
            COL+= 2;
            solveMaze(COL,ROW);
         }
         else 
            wrongChoice(COL,ROW); 


   }

1 个答案:

答案 0 :(得分:0)

可以提供部分结果(最初为空)作为参数。一个人可以返回一个结果。 递归的另一个参数通常是可能的候选者的集合。

例如:

public static void solveMaze(int COL, int ROW, Path pathTaken) {
    Path pathTaken = new Path();
    if (solveMazeRecursively(START_COL, START_ROW, pathTaken)) {
        ...
    }
}

private static boolean solveMazeRecursively(int COL, int ROW, Path pathTaken) {
    if (drawArray[COL][ROW+1] == 'E') {
        System.out.println(pathTaken);
        return true;
    }
    // The real work...
    if (drawArray[COL][ROW+1] == ' ' && drawArray[COL][ROW+2] != '*'){
        drawArray[COL][ROW+2] = '*';
        ROW += 2;
        takenPath.add(COL, ROW+2);
        if (solveMazeRecursively(COL,ROW, takenPath)) {
            return true;
        }
        takenPath.remove(COL, ROW+2);
     }  

递归意味着首先进行延迟检查是否必须执行任何操作(解决方案存在或无法继续),否则委托给新的函数实例。