在这个示例代码中,回溯发生在哪里? package迷宫; 导入java.util.ArrayList; 导入java.util.Collections; 导入java.util.Random; 公共类迷宫{ 公共静态void main(字符串[]args){ 国际板[][]=新国际[31][121]; Random rand=新的Random(); 对于(int i=0;i

在这个示例代码中,回溯发生在哪里? package迷宫; 导入java.util.ArrayList; 导入java.util.Collections; 导入java.util.Random; 公共类迷宫{ 公共静态void main(字符串[]args){ 国际板[][]=新国际[31][121]; Random rand=新的Random(); 对于(int i=0;i,java,recursion,backtracking,maze,Java,Recursion,Backtracking,Maze,,答案在于调用堆栈,并了解堆栈的每一层发生了什么。“回溯”在一个递归调用耗尽其for循环时发生,之后,该方法返回,从堆栈中弹出一级,并在发出调用的堆栈级别上下文的for循环中继续 只映射出两个级别的调用有助于澄清问题。您会发现,在第一个“级别”(递归的根调用)中,for循环只是按照您的预期进行迭代,但它会穿插在它所做的递归调用的处理中(每个调用都创建了一个“下一个级别”的递归) 调用堆栈底层的for循环经历了所有的迭代,而上面层的for循环可能只在第一次迭代中。谢谢你给我看那个视频。但是,我仍然

,答案在于调用堆栈,并了解堆栈的每一层发生了什么。“回溯”在一个递归调用耗尽其for循环时发生,之后,该方法返回,从堆栈中弹出一级,并在发出调用的堆栈级别上下文的for循环中继续

只映射出两个级别的调用有助于澄清问题。您会发现,在第一个“级别”(递归的根调用)中,for循环只是按照您的预期进行迭代,但它会穿插在它所做的递归调用的处理中(每个调用都创建了一个“下一个级别”的递归)


调用堆栈底层的for循环经历了所有的迭代,而上面层的for循环可能只在第一次迭代中。

谢谢你给我看那个视频。但是,我仍然不明白他用堆栈和条件显示的部分是如何存在于我的程序中的。你能告诉我我我的程序是如何运行的吗正在做同样的事情吗?你还想得到答案吗?是的,任何你能帮助解释回溯发生在哪里的事情都会很好。我想我误解了递归的工作方式。你说这个方法返回,但我不理解,因为我只调用了这个方法一次,没有返回语句。我也没有你知道哪个部分应该从堆栈中弹出一层吗?我看了一个视频,其中堆栈显示得更清楚,我理解该方法应该如何工作,但我不知道我的方法在哪里做这些事情。你能帮我指出这些点吗?如果这是一个愚蠢的问题,对不起。该方法会调用自身-这是recursion。此外,当控件到达末尾时,每个函数/方法都会返回,即使没有显式的
return
语句。听起来像是复习了指令处理的基础知识,函数可能会有所帮助。这里有一个递归调用
递归(r-2,c,board);
如果你编写一个方法
public-void无穷(){infected();}
调用它,很快就会出现堆栈溢出。
package maze;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Maze {


    public static void main(String[] args) {
        int board[][] = new int[31][121];
        Random rand = new Random();
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                board[i][j]=1;
            }
        }
        int r = rand.nextInt(board.length);
        while(r%2==0){
            r=rand.nextInt(board.length);
        }

        int c = rand.nextInt(board[0].length);
        while(c%2==0){
            c=rand.nextInt(21);
        }
        System.out.format("r is %d and c is %d\n",r,c);
        board[r][c]=0;
        recursion(r,c,board);
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j]==1) {
                    System.out.print("#");
                } else if (board[i][j]==0) {
                    System.out.print(" ");
                }

            }
            System.out.println("");
        }

    }
    public static void recursion(int r, int c,int[][] board){
        ArrayList<Integer> randDirections = generateDirections();
        int[] randDir=new int[randDirections.size()];

        for (int i = 0; i < randDir.length; i++) {
            randDir[i]=randDirections.get(i);
            System.out.println(randDir[i]);
        }

        for (int i = 0; i < randDir.length; i++) {

            switch(randDir[i]){
                case 1:
                    //checks up position
                    if (r-2>=0) {
                        if (board[r-2][c]!=0) {
                            board[r-2][c] = 0;
                            board[r-1][c] = 0;
                            recursion(r - 2, c,board);
                        }
                    }
                    break;
                case 2:
                    //checks right position
                    if (c + 2 <= board[0].length - 1){
                        if (board[r][c + 2] != 0) {
                            board[r][c + 2] = 0;
                            board[r][c + 1] = 0;
                            recursion(r, c + 2,board);
                        }
                    }
                    break;
                case 3:
                    //checks down position
                    if (r + 2 <= board.length - 1){
                        if (board[r + 2][c] != 0) {
                            board[r+2][c] = 0;
                            board[r+1][c] = 0;
                            recursion(r + 2, c,board);
                        }
                    }
                    break;
                case 4:
                    //checks left position
                    if (c - 2 >= 0){
                        if (board[r][c - 2] != 0) {
                            board[r][c - 2] = 0;
                            board[r][c - 1] = 0;
                            recursion(r, c - 2,board);
                        }
                    }
                    break;
            }  
        }
    }
    public static ArrayList<Integer> generateDirections(){
        ArrayList<Integer> randoms = new ArrayList();
        for (int i = 0; i < 4; i++) {
            randoms.add(i+1);
        }
        Collections.shuffle(randoms);
        return randoms;
    }
}