程序设计与数据结构有关递归的学习:迷宫项目

程序设计与数据结构有关递归的学习:迷宫项目

学习《程序设计与数据结构》中的11章递归,其中有段关于迷宫设计的代码。它通过设计一个二元数组,并在其中随机分布0和1,1为通路,0则不能通过。当程序开始运行的时候,它会首先把试探的路以1变3的方式来体验,当最后得到出去的路的时候,它会将3变成7来显示。

Maze.java

package ch11;

/**
 * Created by Funny_One on 2017/9/6.
 */
public class Maze {
    private final int TRIED = 3;
    private final int PATH = 7;
    private int[][] grid = {
            {1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1},
            {1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1},
            {0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0},
            {1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0},
            {1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1},
            {1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1},
            {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};

    public boolean traverse(int row, int column) {
        boolean done = false;
        if (valid(row, column)) {
            grid[row][column] = TRIED;
            if (row == grid.length - 1 && column == grid[0].length - 1) {
                done = true;
            } else {
                done = traverse(row + 1, column);//往下走
                if (!done) {
                    done = traverse(row, column + 1);//往右走
                }
                if (!done) {
                    done = traverse(row - 1, column);//往上走
                }
                if (!done) {
                    done = traverse(row, column - 1);//往左走
                }
            }
            if (done) {
                grid[row][column] = PATH;
            }

        }
        return done;
    }

    private boolean valid(int row, int column) {
        boolean result = false;

        if (row >= 0 && row < grid.length && column >= 0 && column < grid[row].length ) {
            if (grid[row][column] == 1) {
                result = true;
            }
        }
        return result;
    }

    public String toString() {
        String result = "\n";
        for (int row = 0; row < grid.length; row++) {
            for (int column = 0; column < grid[row].length; column++) {
                result += grid[row][column] + "";

            }
            result += "\n";
        }
        return result;
    }
}

MazeSearch.java

package ch11;

/**
 * Created by Funny_One on 2017/9/7.
 */
public class MazeSearch {
    public static void main (String[] args){
        Maze labyrinth = new Maze();

        System.out.println(labyrinth);

        if(labyrinth.traverse(0,0)){
            System.out.println("The maze was successful traversed!");
        }else {
            System.out.println("There is no possible path.");
        }

        System.out.println(labyrinth);
    }
}

效果:

问题:但当时对递归并不熟悉,因此根本不能理解它以走迷宫的逻辑来走,为什么碰到0之后才会转换为另一个走向。最后经过一步步调试,仔细研究之后,我得到这么一个解释:

当程序从(0,0)向下走的时候,走到(1,0),然后再次执行这个方法,填入的参数则是(1,0)。(1,0)的值是1,所以就会执行参数为(1,0)的方法中的走法。首先向下走,走到(2,0),值为0,于是便无法触发参数为(2,0)的tranverse方法,于是退回到参数为(1,0)的tranverse方法。然后轮到向右走,走到(1,1),值为0,于是无法触发参数为(1,1)的tranverse方法,于是又退回参数(1,0)的tranverse方法。然后轮到向上走,走到(0,0),值为3,无法触发参数为(0,0)的tranverse的方法,于是又退回参数为(1,0)的tranverse方法。然后轮到向左走,走到(1,-1),因为越界异常,所以无法触发参数为(1,-1)的tranverse方法,于是又退回参数为(1,0)的tranverse方法。然后没有接下来的方法了,于是参数为(1,0)的tranverse方法就执行完成了,于是退回并继续执行参数(0,0)的tranverse的参数方法,然后执行到参数为(0,0)的tranverse方法中的向右走,然后重复以上步骤。走到最后的时候done变为true,一个个递归将对应位置的3转化为7后死掉,从而可以得到一条通路。

posted @ 2017-09-09 15:14  FunnyOne  阅读(320)  评论(0编辑  收藏  举报